社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

romeovs • 5 年前 • 1496 次点击  

假设我有一个函数 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
 
1496 次点击  
文章 [ 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))

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