次のコードがあります。
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
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()
名前の競合が発生するのがこの 1 つの関数内だけである場合は、いつでも関数のスコープ内でモジュールを再インポートし、名前を変更してあいまいさを回避できます。
import m
def f(m=None):
import m as the_real_m
if m is None:
k = the_real_m.M()
m
inimport m as the_real_m
は少し紛らわしいかもしれませんが、ここでは変数参照ではないので、間違ったものに解決されても問題ありません。
個人的には、関数の引数の名前を変更したいのですが、キーワード引数を使用すると、引数の名前がシステムの他の部分に公開されるインターフェイスの一部になる可能性があることに気づきました。可能な限り明確な名前を付けておくことがより重要になる可能性があります。
次のように、パラメーター m のデフォルト値をモジュールの属性に設定できます。
import m
def f(m=m.M):
m()
ただし、パラメーターを使用してグローバル (モジュール名) をシャドウすることは、最も Pythonic な方法ではありません。よりPython的には、パラメーターMに名前を付けます。これは、それが機能するメソッドMに一致します。
import m
def f(M=m.M):
M()
このようにして、必要に応じてモジュールの他の属性を参照できます。