Cor*_*ack 9 python fortran python-2.7
在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()
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:有没有办法确保使用的所有变量test()都是本地的,并且没有副作用.我使用的是Python 2.7.x. 如果存在局部变量,则会打印错误.
所以我的问题是:有没有办法确保test()中使用的所有变量都是局部的,并且没有副作用.
有一种技术可以验证不访问全局变量.
这是一个装饰器,用于扫描函数的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
Run Code Online (Sandbox Code Playgroud)
为了实现这一点,您需要一个可接受的全局引用(即模块)的停止列表.该技术可以扩展到涵盖其他操作码,例如STORE_GLOBAL和DELETE_GLOBAL.
总而言之,我没有看到直接的方法来检测副作用.
| 归档时间: |
|
| 查看次数: |
791 次 |
| 最近记录: |