Skip to content

Commit db1a018

Browse files
committed
Implement an ad-hoc hot reload
1 parent d5b27ac commit db1a018

2 files changed

Lines changed: 34 additions & 5 deletions

File tree

src/replhelper/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
from .core import customized_ipython, ipython_options
1+
from .core import customized_ipython, ipython_options, revise

src/replhelper/core.py

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,21 @@
1+
# TODO: replace object.__XXX__(self, ...) with super().__XXX__(...)
2+
# once Python 2 support is removed.
3+
14
from __future__ import print_function
25

36
import warnings
47
import sys
58

9+
try:
10+
from importlib import reload
11+
except ImportError:
12+
try:
13+
from imp import reload
14+
except ImportError:
15+
pass # Python 2?
16+
17+
_Main = None
18+
619

720
def jl_name(name):
821
if name.endswith('_b'):
@@ -32,13 +45,15 @@ def __init__(self, julia):
3245

3346
def __setattr__(self, name, value):
3447
if name.startswith('_'):
35-
super(JuliaNameSpace, self).__setattr__(name, value)
48+
object.__setattr__(self, name, value)
49+
# super().__setattr__(name, value)
3650
else:
3751
self.__julia.set_var(name, value)
3852

3953
def __getattr__(self, name):
4054
if name.startswith('_'):
41-
return super(JuliaNameSpace, self).__getattr__(name)
55+
return object.__getattr__(self, name)
56+
# return super().__getattr__(name)
4257
else:
4358
return self.__julia.eval(jl_name(name))
4459

@@ -51,7 +66,7 @@ def __dir__(self):
5166
if sys.version_info.major == 2:
5267
names = set()
5368
else:
54-
names = set(super(JuliaNameSpace, self).__dir__())
69+
names = set(super().__dir__())
5570
names.update(self.__all__)
5671
return list(names)
5772
# Override __dir__ method so that completing member names work
@@ -133,9 +148,10 @@ def wrapped(*args, **kwargs):
133148

134149

135150
def ipython_options(**kwargs):
151+
global _Main
136152
from traitlets.config import Config
137153

138-
Main = JuliaNameSpace(JuliaAPI(**kwargs))
154+
_Main = Main = JuliaNameSpace(JuliaAPI(**kwargs))
139155
user_ns = dict(
140156
Main=Main,
141157
)
@@ -178,3 +194,16 @@ def customized_ipython(**kwargs):
178194
warnings.warn(segfault_warning.format(**vars()))
179195
segfault_warned = True
180196
IPython.start_ipython(**ipython_options(**kwargs))
197+
198+
199+
def revise():
200+
"""Ad-hoc hot reload."""
201+
import replhelper
202+
reload(replhelper.core)
203+
204+
if _Main is not None:
205+
_Main.__class__ = replhelper.core.JuliaNameSpace
206+
_Main._JuliaNameSpace__julia.__class__ = replhelper.core.JuliaAPI
207+
replhelper.core._Main = _Main
208+
209+
reload(replhelper)

0 commit comments

Comments
 (0)