2012-05-10 8 views
1

私は、次のコードを持っている:私は本当に同じパラメータ名とモジュール名の両方を維持することを好むだろう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を参照する方法はありますか?

答えて

2

あなただけのインポートモジュール内のモジュールの名前を変更する気にしない場合は、あなたができる:

import m as m_ 

def f(m=None): 
    if m is None: 
     k = m_.M() 
1

あなたは通常モジュール名と同じパラメータが必要な場合は、コードの読みやすさのために、

import m as _m 

def f(m=None): 
    if m is None: 
     k = _m.M() 

ない理想的な、しかし、あなたが得ることができる、おそらく最も近い:しかし、一時的にこのスコープの名前を変更されているモジュールを容認することができ、あなたはこのような何かを行うことができます。

1

のpythonのモジュールが単に他の目的であるので、globals() -builtinが正常に動作します:

import m 

def f(m=None): 
    if m is None: 
     k = globals()['m'].M() 
-2

あなたはこのように、モジュールの属性であることをパラメータmのデフォルト値を設定することができます。

import m 

def f(m=m.M): 
    m() 

しかし、パラメータを使用してグローバル(モジュール名)をシャドーイングすることは、これを実行する最もPythonの方法ではありません。もっとPython的には、パラメータMに名前をつけます。これは、それが動作するメソッドMに一致します。

import m 

def f(M=m.M): 
    M() 

このようにして、必要に応じてモジュールの他の属性を参照することができます。

+0

あなたは関数に何か他のものを渡したいのですが?それは良い解決策ではありません。 – mata

+0

これを渡すと、関数定義のDEFAULT値がオーバーライドされます。 –

+0

番号。モジュールをパラメータにデフォルト値としてバインドするだけで、関数内で使用できるようになります。あなたのモジュールを使って誰かにそのパラメータを説明しようとしてください。それを行う唯一の理由は、関数が何をしているのかを変更するためにdifferenオブジェクトを渡すことができるようにする場合です。 – mata

0

名前の衝突が発生するこの関数内にある場合は、関数のスコープ内でモジュールをいつでも再インポートし、名前を変更してあいまいさを避けることができます。 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は少し混乱することができますが、それは間違ったことを解決するには問題がありませんので、ここでは変数の参照ではありません。

私はむしろ関数の引数の名前を変更したいと思いますが、キーワード引数を使用すると、システムの他の部分に公開されているインターフェイスの一部になる可能性があります。重要。

関連する問題