如何在Python中访问模块级名称?

时间:2012-05-10 23:19:22

标签: 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?

5 个答案:

答案 0 :(得分:2)

如果您不介意仅在导入模块中更改模块名称,则可以执行以下操作:

import m as m_

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

答案 1 :(得分:1)

如果您需要与通常的模块名称相同的参数,为了代码可读性,但可以容忍为此范围临时重命名模块,您可以执行以下操作:

import m as _m

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

不理想,但可能是你能得到的最接近的。

答案 2 :(得分:1)

python中的模块只是另一个对象,因此globals() - 内置工作正常:

import m

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

答案 3 :(得分:0)

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

import m

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

m中的import m as the_real_m可能有点令人困惑,但这里的不是变量引用,所以它解决错误的东西没有问题。

就个人而言,我宁愿重命名函数参数,但我意识到使用关键字参数,参数的名称可以是暴露给系统其他部分的接口的一部分,并且以最清晰的名称保留它可能更重要

答案 4 :(得分:-2)

您可以将参数m的默认值设置为模块的属性,如下所示:

import m

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

但是,使用参数遮蔽全局(模块名称)并不是最常用的Pythonic方法。更奇怪的是,你要命名参数M,它与它将扮演的方法M相匹配。

import m

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

这样,如果需要,您仍然可以参考模块的其他属性。