Py学习  »  Python

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

romeovs • 5 年前 • 1642 次点击  

假设我有一个函数 foo 在具有命名参数的大型python项目中 bar 以下内容:

def foo(bar=42):
  do_something_with_bar(bar)

在代码库中,在使用或省略 酒吧 参数。

现在假设我正在更改这个函数,因为它有一个bug,并且希望开始使用某个包中的函数,这个包碰巧也被调用 酒吧 是的。我不能用 酒吧 当我像这样导入时的函数:

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

但是这个文件也包含了很多调用 酒吧 所以这是不允许的。

我能看到这个工作的唯一方法是将 酒吧 方法来自 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))

有什么办法我可以重新命名 酒吧 中的参数 函数,而不调用 整个代码库中的函数中断?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/47116
 
1642 次点击  
文章 [ 5 ]  |  最新文章 5 年前
Victor Sales
Reply   •   1 楼
Victor Sales    6 年前

你可以用 globals() 引用全局变量。

def foo(bar=42):
    package_bar = globals()['bar']
    do_something_with_bar(package_bar(bar))

这不应该破坏你的代码库。

Sraw
Reply   •   2 楼
Sraw    6 年前

我不知道我是否正确理解了您的问题,但是如果您只是想避免特定函数中的名称空间冲突,为什么不将其导入到函数中呢?

def foo(bar=42):
  from package import bar as package_bar
  do_something_with_bar(package_bar(bar))

你可以在顶部添加一行注释来提醒自己。

B. Go
Reply   •   3 楼
B. Go    6 年前

如果你幸运的话,foo函数只被“foo()”或“foo(24)”调用,而不被“foo(bar=42)”调用,然后你可以在不破坏任何东西的情况下放置任何新名称而不是bar。
否则,您必须grep/搜索“foo(bar=”的所有呼叫,并替换它们,小心可能的额外空格,如“foo(bar=”)。

Dan D.
Reply   •   4 楼
Dan D.    6 年前

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

from package import bar

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

def _foo(baz):
    do_something_with_bar(bar(baz))

那么你可以自由使用 bar 在该函数中作为包中函数的名称,而不是参数。

cs95
Reply   •   5 楼
cs95    6 年前

这是一个普遍的问题。在这种情况下,为 package ,以便您可以安全地参考 包裹 bar 通过 包裹 命名空间,而不会遇到命名冲突。

import package
from package import bar

def foo(bar=42):
    do_something_with_bar(package.bar(bar))

您仍然会导入模块一次,但是现在有两种方法可以引用 酒吧 是的。