假设我在一个大型Python项目中有一个名为foo
的函数bar
:
def foo(bar=42):
do_something_with_bar(bar)
在使用或忽略命名的bar
参数的调用中,此函数在代码库中被大量调用。
现在说我要更改此函数,因为它有一个错误,想从某个程序包开始使用该函数,巧合的是,该程序包也称为bar
。像这样导入时,我无法使用bar
函数:
from package import bar
def foo(bar=42):
# how can I use the package.bar function here?
do_something_with_bar(bar)
我可以使用类似的东西:
from package import bar as package_bar
但是该文件还包含许多bar
的调用,因此是不可行的。
我看到此工作的唯一方法是从bar
重命名package
方法:
from package import bar
package_bar = bar
def foo(bar=42):
do_something_with_bar(package_bar(bar))
或多次导入(未试用):
from package import bar, bar as package_bar
def foo(bar=42):
do_something_with_bar(package_bar(bar))
是否可以通过某种方式在bar
函数中重命名foo
参数,而不会在整个代码库中中断对foo
函数的所有调用?
答案 0 :(得分:6)
这是一个常见问题。在这种情况下,为package
附加一条导入语句会有所帮助,因此您可以通过package
命名空间安全地引用bar
的{{1}},而不会遇到命名冲突
package
您仍然最终只能导入一次模块,但是现在有两种引用import package
from package import bar
def foo(bar=42):
do_something_with_bar(package.bar(bar))
的方式。
答案 1 :(得分:2)
通过调用具有不同命名参数的另一个函数来替换函数主体:
from package import bar
def foo(bar=42):
return _foo(baz=bar)
def _foo(baz):
do_something_with_bar(bar(baz))
然后,您可以在该函数中随意使用bar
作为包中函数的名称,而不是参数。
答案 2 :(得分:0)
如果幸运的话,仅通过“ foo()”或“ foo(24)”调用foo函数,而通过“ foo(bar = 42)”在任何地方调用foo函数,然后可以使用任何新名称代替bar不破坏任何东西。
否则,您必须grep /搜索“ foo(bar =”)的所有调用,并也将它们替换掉,请注意“ foo(bar =”。“中可能出现的多余空格。
答案 3 :(得分:0)
我不知道我是否正确理解了您的问题,但是如果您只是想避免该特定函数中的命名空间冲突,为什么不将其导入该函数中?
def foo(bar=42):
from package import bar as package_bar
do_something_with_bar(package_bar(bar))
您可以在顶部添加一行注释以提醒自己。
答案 4 :(得分:-1)
您可以使用globals()
来引用全局变量。
def foo(bar=42):
package_bar = globals()['bar']
do_something_with_bar(package_bar(bar))
这不应该破坏代码库中的任何内容。