私は、次のコードを持っている:私は本当に同じパラメータ名とモジュール名の両方を維持することを好むだろうPythonでモジュールレベルの名前にアクセスするには?
import m
def f(m=None):
if m is None:
k = m.M() # I want this m to refer to the imported module, not the parameter
を。明示的にモジュールmを参照する方法はありますか?
私は、次のコードを持っている:私は本当に同じパラメータ名とモジュール名の両方を維持することを好むだろうPythonでモジュールレベルの名前にアクセスするには?
import m
def f(m=None):
if m is None:
k = m.M() # I want this m to refer to the imported module, not the parameter
を。明示的にモジュールmを参照する方法はありますか?
あなただけのインポートモジュール内のモジュールの名前を変更する気にしない場合は、あなたができる:
import m as m_
def f(m=None):
if m is None:
k = m_.M()
あなたは通常モジュール名と同じパラメータが必要な場合は、コードの読みやすさのために、
import m as _m
def f(m=None):
if m is None:
k = _m.M()
ない理想的な、しかし、あなたが得ることができる、おそらく最も近い:しかし、一時的にこのスコープの名前を変更されているモジュールを容認することができ、あなたはこのような何かを行うことができます。
のpythonのモジュールが単に他の目的であるので、globals()
-builtinが正常に動作します:
import m
def f(m=None):
if m is None:
k = globals()['m'].M()
あなたはこのように、モジュールの属性であることをパラメータmのデフォルト値を設定することができます。
import m
def f(m=m.M):
m()
しかし、パラメータを使用してグローバル(モジュール名)をシャドーイングすることは、これを実行する最もPythonの方法ではありません。もっとPython的には、パラメータMに名前をつけます。これは、それが動作するメソッドMに一致します。
import m
def f(M=m.M):
M()
このようにして、必要に応じてモジュールの他の属性を参照することができます。
名前の衝突が発生するこの関数内にある場合は、関数のスコープ内でモジュールをいつでも再インポートし、名前を変更してあいまいさを避けることができます。 import m as the_real_m
で
import m
def f(m=None):
import m as the_real_m
if m is None:
k = the_real_m.M()
m
は少し混乱することができますが、それは間違ったことを解決するには問題がありませんので、ここでは変数の参照ではありません。
私はむしろ関数の引数の名前を変更したいと思いますが、キーワード引数を使用すると、システムの他の部分に公開されているインターフェイスの一部になる可能性があります。重要。
あなたは関数に何か他のものを渡したいのですが?それは良い解決策ではありません。 – mata
これを渡すと、関数定義のDEFAULT値がオーバーライドされます。 –
番号。モジュールをパラメータにデフォルト値としてバインドするだけで、関数内で使用できるようになります。あなたのモジュールを使って誰かにそのパラメータを説明しようとしてください。それを行う唯一の理由は、関数が何をしているのかを変更するためにdifferenオブジェクトを渡すことができるようにする場合です。 – mata