我有以下代码:
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?
我有以下代码:
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?
如果您不介意仅在导入模块中更改模块名称,您可以这样做:
import m as m_
def f(m=None):
if m is None:
k = m_.M()
如果您需要与通常的模块名称相同的参数以提高代码的可读性,但可以容忍模块在此范围内临时重命名,您可以执行以下操作:
import m as _m
def f(m=None):
if m is None:
k = _m.M()
不理想,但可能是你能得到的最接近的。
python 中的模块只是另一个对象,所以globals()
-builtin 可以正常工作:
import m
def f(m=None):
if m is None:
k = globals()['m'].M()
如果只是在这个函数中发生名称冲突,您总是可以在函数范围内重新导入模块并重命名它以避免歧义。
import m
def f(m=None):
import m as the_real_m
if m is None:
k = the_real_m.M()
m
inimport m as the_real_m
可能有点令人困惑,但这里它不是变量引用,所以它解决错误的问题没有问题。
就个人而言,我宁愿重命名函数参数,但我意识到使用关键字参数,参数的名称可以是暴露给系统其他部分的接口的一部分,并且尽可能使用最清晰的名称可能更重要。
您可以将参数 m 的默认值设置为模块的属性,如下所示:
import m
def f(m=m.M):
m()
但是,使用参数隐藏全局(模块名称)并不是最 Pythonic 的方法。更 Python 地,您可以将参数命名为 M,它与将要充当的方法 M 匹配。
import m
def f(M=m.M):
M()
这样,如果需要,您仍然可以引用模块的其他属性。