2012-05-10 60 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() 

但是,使用参数映射全局(模块名称)并不是实现它的最Pythonic方法。在Python中更多的是,你可以命名参数M,它与它将要扮演的方法M相匹配。

import m 

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

这样,如果需要,仍然可以引用模块的其他属性。

+0

以及如果你想传递别的东西给函数呢?这不是一个好的解决方案。 – mata

+0

然后你传递它,它覆盖函数定义中的DEFAULT值。 –

+0

没有。将一个模块绑定到一个参数作为默认值只是为了能够在函数中使用它并不是你所做的事情。尝试使用你的模块向某人解释该参数。这样做的唯一理由是,如果你想能够通过一个不同的对象来改变功能正在做的事情。 – mata

0

如果只是在名称冲突发生的这一个函数中,您可以随时在函数的作用域内重新导入模块并重命名它以避免模糊性。

import m 

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

import m as the_real_mm可以是一个有点混乱,但在这里它不是变量引用所以有它解析为错误的东西没有问题。

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

相关问题