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

时间:2018-12-18 16:13:12

标签: python import python-import

假设我在一个大型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函数的所有调用?

5 个答案:

答案 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))

这不应该破坏代码库中的任何内容。