1

次のコードがあります。

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 を明示的に参照する方法はありますか?

4

5 に答える 5

2

インポートするモジュール内でのみモジュールの名前を変更してもかまわない場合は、次のようにすることができます。

import m as m_

def f(m=None):
    if m is None:
        k = m_.M()
于 2012-05-10T23:21:37.383 に答える
1

コードを読みやすくするために、通常のモジュール名と同じパラメーターが必要であるが、このスコープのためにモジュールの名前が一時的に変更されることを許容できる場合は、次のようにすることができます。

import m as _m

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

理想的ではありませんが、おそらく最も近いものです。

于 2012-05-10T23:22:51.010 に答える
1

Python のモジュールは単なる別のオブジェクトであるため、globals()-builtin は正常に機能します。

import m

def f(m=None):
    if m is None:
        k = globals()['m'].M()
于 2012-05-10T23:23:06.463 に答える
0

名前の競合が発生するのがこの 1 つの関数内だけである場合は、いつでも関数のスコープ内でモジュールを再インポートし、名前を変更してあいまいさを回避できます。

import m

def f(m=None):
    import m as the_real_m
    if m is None:
        k = the_real_m.M()

minimport m as the_real_mは少し紛らわしいかもしれませんが、ここでは変数参照ではないので、間違ったものに解決されても問題ありません。

個人的には、関数の引数の名前を変更したいのですが、キーワード引数を使用すると、引数の名前がシステムの他の部分に公開されるインターフェイスの一部になる可能性があることに気づきました。可能な限り明確な名前を付けておくことがより重要になる可能性があります。

于 2012-05-10T23:43:19.560 に答える
-2

次のように、パラメーター m のデフォルト値をモジュールの属性に設定できます。

import m

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

ただし、パラメーターを使用してグローバル (モジュール名) をシャドウすることは、最も Pythonic な方法ではありません。よりPython的には、パラメーターMに名前を付けます。これは、それが機能するメソッドMに一致します。

import m

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

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

于 2012-05-10T23:25:01.417 に答える