在Fortran的Python中是否存在等效的"隐式无"?

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. 如果存在局部变量,则会打印错误.

Ray*_*ger 8

所以我的问题是:有没有办法确保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_GLOBALDELETE_GLOBAL.

总而言之,我没有看到直接的方法来检测副作用.


Jon*_*art 0

只是完全避免使用全局范围的变量。如果必须的话,请在它们的名称前添加一些您永远不会在局部变量名称中使用的内容。