gpt4 book ai didi

python - 如何在 Python 中静态(词法)绑定(bind)名称?

转载 作者:行者123 更新时间:2023-12-01 04:23:38 25 4
gpt4 key购买 nike

考虑这段代码:

class Bar(object): pass

class Foo(object):
def bar(self): return Bar()

f = Foo()
def Bar(): pass
print(f.bar())

它打印 None 。但是可怜的家伙bar没想到Bar成为后来的样子!

我的问题是,我可以在 Foo 中编写的“最好”(最优雅、最高效、最Pythonic,等等)代码是什么? (希望不会污染外部范围)这将确保bar可以引用Bar它是在声明时定义的,而不是调用时定义的?

(并不是我无法想出任何解决方案,而是我不知道正确的解决方案是什么。)

最佳答案

要在创建函数/方法时“静态绑定(bind)”名称,您可以使用默认参数:

class Bar(object): 
pass

class Foo(object):

def bar(self, Bar=Bar):
return Bar()

this famous Python "gotcha" ,默认参数值仅计算一次。

在这种情况下它并不是很有用,因为将函数命名为与类相同的名称是您自己的愚蠢错误(并且随后的错误为您提供了有用的信息);绑定(bind)名称只会让事情变得更加困难,例如稍后模拟类(class)。但是,它对于解决嵌套函数中的后期绑定(bind)问题可能很有用,如 this question 所示。 .

<小时/>

ShadowRanger's comment ,如果您使用的是 Python 3.x,则可以将 *, 添加到参数列表 (bar(self, *, Bar=Bar)) 以防止调用者通过传递太多位置参数而意外破坏默认值;任何额外的参数都会引发 TypeError

关于python - 如何在 Python 中静态(词法)绑定(bind)名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33410590/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com