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

如果只是在这个函数中发生名称冲突,您总是可以在函数范围内重新导入模块并重命名它以避免歧义。

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 回答