gpt4 book ai didi

python - 如何将此 Python 2.7 代码转换为 Python 3?

转载 作者:太空狗 更新时间:2023-10-30 01:30:44 26 4
gpt4 key购买 nike

以下代码适用于 Python 2.7,可将局部变量动态注入(inject)函数范围:

myvars = {"var": 123}

def func():
exec("")
locals().update(myvars)
print(var)

func()
# assert "var" not in globals()

这有点微妙,但是 exec 语句的存在向编译器表明局部 namespace 可能被修改。在引用实现中,它将名称“locals”的查找从 LOAD_GLOBAL op 转换为 LOAD_NAME op,从而能够添加到本地命名空间。

在 Python 3 中,exec 变成了函数而不是语句,locals() 调用返回命名空间的副本,其中修改无效。

如何在 Python 3 中重新创建在函数内动态创建局部变量的想法?或者这是只有 Python 2.x 才有的“功能”?

注意:代码不得绑定(bind)外部作用域中的名称。

最佳答案

我不推荐这样做,但您可以将函数体放在类语句中:

myvars = {"var": 123}

def func():
class Bleh:
locals().update(myvars)
print(var)

func()

与 Python 2 代码一样,修改 locals() 在这种情况下起作用的事实在技术上没有记录并且可能会发生变化。类范围必须使用实际的字典来解析局部变量,但理论上,稍后的 Python 实现可能会为 locals() 或类似的东西复制该字典。

与 Python 2 代码一样,这样做会干扰闭包变量解析,包括像下面这样的微妙情况:

myvars = {"var": 123}

def func():
class Bleh:
locals().update(myvars)
print([var for x in (1, 2, 3)])

func()

甚至

def func():
class Bleh:
var = 123
print([var for x in (1, 2, 3)])

func()

这两种情况都会导致 NameError,因为列表理解会创建一个无法访问 var 的新范围。

在 Python 2 中,尝试将闭包变量与 exec 一起使用会导致 SyntaxError。如果您尝试使用类语句复制 Python 3 中的功能,您将不会得到任何此类检测。

最后,Python 在 class 语句完成后尝试构建一个类,这可能会导致奇怪的问题,例如 __set_name__ 方法意外运行。您至少可以通过使用元类来解决此问题:

class NoClass(type):
def __new__(self, *args, **kwargs):
return None

def func():
class Bleh(metaclass=NoClass):
...

关于python - 如何将此 Python 2.7 代码转换为 Python 3?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57595351/

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