私はウォークアラウンドしようとしているreload()
(Python 2の組み込み版とimportlib
の両方)の厄介な動作を発見しました。super()をエレガントで安全な方法(Pythonモジュールの再読み込みに関して)でどのように使うことができますか?
私はインタラクティブなPythonインタプリタでデータを分析しています。私のコードは、よく変更されるモジュール(Python 2と3の両方に対応しています)で構成されています。
データを読み込む時間が長いため、インタープリタを再起動できないため、代わりにモジュールを再帰的に読み込むことをお勧めします。
問題はreload()
updates the code but preserves the module global scope(Python 3 importlib.reload()
にも適用されます)です。 super()
を使用する方法には有害であると思われます(何が起こっているかを理解するのにはしばらく時間がかかりました)。
モジュールbar.pyための最小限の失敗例:
class Bar(object):
def __init__(self):
super(Bar, self).__init__()
である:
>>> import bar
>>> class Foo(bar.Bar):
... pass
...
>>> reload(bar)
<module 'bar' from '[censored]/bar.py'>
>>> Foo()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "[censored]/bar.py", line 3, in __init__
super(Bar, self).__init__()
TypeError: super(type, obj): obj must be an instance or subtype of type
I月:Pythonの2と互換性 ない
- use
super()
without arguments in Python 3 manner( )、 - それを放棄する代わりに
Bar.__init__(self)
(which is harder to maintainとdiscouraged)を呼び出してください。 - monkey-patchクラスを追加したクラス属性を追加して、クラス自体に循環 の参照を追加しました。
私が好きなアイデアはありません。問題に対処する他の方法はありますか?
あなたの 'bar.py'は、' __init__'メソッドの代わりに 'super(Bar、self).__ init __()'をクラスレベルに置いているので既に失敗しています。 – user2357112
'super 'の使用は実際には無効です。 'super'はクラス本体にないクラスのメソッド内で使われます。 – direprobs
また、モジュールをリロードすることは、一般的に正しく行うのが難しく、 'reload'は非常に単純なケースしか処理しません。最善の策は常にPythonを最初から再起動することです。 – user2357112