在Python中重命名命名参数以避免与import语句命名冲突

rom*_*ovs 7 python import python-import

假设我foo在一个具有命名参数的大型Python项目中有一个函数bar:

def foo(bar=42):
  do_something_with_bar(bar)
Run Code Online (Sandbox Code Playgroud)

在使用或省略命名bar参数的调用中,在代码库中调用此函数.

现在说我正在改变这个功能,因为它有一个bug并且想要开始使用来自某个包的函数,这也恰巧也被称为bar.bar当我像这样导入它时,我无法使用该功能:

from package import bar

def foo(bar=42):
  # how can I use the package.bar function here?
  do_something_with_bar(bar)
Run Code Online (Sandbox Code Playgroud)

我可以使用类似的东西:

from package import bar as package_bar
Run Code Online (Sandbox Code Playgroud)

但是这个文件也包含很多调用,bar所以这是一个禁忌.

我能看到这个工作的唯一方法是重命名bar方法package:

from package import bar
package_bar = bar

def foo(bar=42):
  do_something_with_bar(package_bar(bar))
Run Code Online (Sandbox Code Playgroud)

或者多次导入(未经测试):

from package import bar, bar as package_bar

def foo(bar=42):
  do_something_with_bar(package_bar(bar))
Run Code Online (Sandbox Code Playgroud)

有没有什么方法可以重命名函数中的bar参数foo,而不是foo在整个代码库中对函数的所有调用都会破坏?

cs9*_*s95 6

这是一个常见问题.在这种情况下,它有助于有额外import语句package,这样你就可以安全地引用packagebar通过package命名空间,而不会在命名冲突.

import package
from package import bar

def foo(bar=42):
    do_something_with_bar(package.bar(bar))
Run Code Online (Sandbox Code Playgroud)

您仍然最终导入模块一次,但现在有两种方法可供参考bar.


Dan*_* D. 2

将函数体替换为对具有不同命名参数的另一个函数的调用:

from package import bar

def foo(bar=42):
    return _foo(baz=bar)

def _foo(baz):
    do_something_with_bar(bar(baz))
Run Code Online (Sandbox Code Playgroud)

然后您可以在该函数中自由使用bar包中的函数名称而不是参数。