gpt4 book ai didi

python - Fortran 的 "implicit none"在 Python 中是否有等效项?

转载 作者:太空狗 更新时间:2023-10-29 20:18:28 25 4
gpt4 key购买 nike

在 Fortran 中有一个语句 Implicit none 当一个局部变量没有被声明但是被使用时会抛出一个编译错误。我知道 Python 是一种动态类型的语言,变量的范围可以在运行时确定。

但我想避免在忘记初始化局部变量但在主代码中使用它时发生的某些意外错误。例如,以下代码中的变量 x 是全局变量,尽管我并没有这样打算:

def test():
y=x+2 # intended this x to be a local variable but forgot
# x was not initialized
print y


x=3
test()

所以我的问题是:是否有任何方法可以确保 test() 中使用的所有变量都是本地变量并且没有副作用。我正在使用 Python 2.7.x。如果存在局部变量,则会打印错误。

最佳答案

So my question is that: Is there any way to ensure all variables used in test() are local to it and that there are no side effects.

有一种技术可以验证未访问全局变量。

这是一个装饰器,它扫描一个函数的操作码以获得 LOAD_GLOBAL

import dis, sys, re, StringIO

def check_external(func):
'Validate that a function does not have global lookups'
saved_stdout = sys.stdout
sys.stdout = f = StringIO.StringIO()
try:
dis.dis(func)
result = f.getvalue()
finally:
sys.stdout = saved_stdout
externals = re.findall('^.*LOAD_GLOBAL.*$', result, re.MULTILINE)
if externals:
raise RuntimeError('Found globals: %r', externals)
return func

@check_external
def test():
y=x+2 # intended this x to be a local variable but forgot
# x was not initialized
print y

为了使这一点切实可行,您需要一个可接受的全局引用(即模块)的停止列表。该技术可以扩展以涵盖其他操作码,例如 STORE_GLOBALDELETE_GLOBAL

综上所述,我没有看到检测副作用的直接方法。

关于python - Fortran 的 "implicit none"在 Python 中是否有等效项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31467987/

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