python - 创建一个新的范围,如 javascript

标签 python python-3.x scope

看完Lisp in Your Language ,我一直在尝试在 Python 中跟进。一切正常,直到我到达 variable assignment and scoping .

最后的电话让我难住了。似乎在 javascript 中,可以创建一个新的范围对象并将对象分配或绑定(bind)到该新范围,而不是使用“this”。在示例链接中:

// use existing local scope or create a new one
scope = scope || {};

[...]

// call the function with these arguments
// and expose scope as this
return fn.apply(scope, args);

在 Python 中,这似乎不可能以同样的方式进行。在此之前我一直在调用 return fn(*args),但现在我对如何编写等效代码感到困惑。

有什么想法或建议吗?

Gist of my updated code

编辑:我已经找到了这个问题的解决方案,至少现在是这样:

# defined outside of the function
global scope_dict
scope_dict = {}

def pl_def(name, value):
    global scope_dict
    scope_dict[name] = value
    return scope_dict[name]

[...]

# use existing scope inside the function
global scope_dict
scope = scope_dict

# resolve all our new string names from our scope
def symbol_check(symbol):
    if isinstance(symbol, list):
        return symbol
    elif symbol in scope:
        return scope[symbol]
    else:
        return symbol
expression = [symbol_check(x) for x in rawExpr]

[...]

# call the function with these arguments
return fn(*args)

最佳答案

在您链接到的页面的代码中,scope 只是一个对象——它没有什么特别之处。但是在 JS 中,您可以使用括号表示法和点表示法访问对象的属性:

//these are equivalent
obj.prop
obj['prop']

在 Python 中,要获取“常规”对象的属性,您必须使用点符号或 getattr()。

由于示例中的 scope 对象只是被视为一个容器,您可以使用 dict 代替,然后代码可能会在没有太多其他修改的情况下工作.巧合的是,{} 在 JS 中创建了一个空对象,但在 Python 中创建了一个空的 dict

关于python - 创建一个新的范围,如 javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32506683/

相关文章:

python - 将列添加到没有任何列的数据集

java - 执行三四天后,通过 spring 注入(inject) "While True"循环的线程停止

javascript - 你能更新一个 Controller 来更新它的子范围吗?

python - Python中的阶乘函数

python - Django 忽略来自第三方模块的翻译字符串

python - 如何在Python 3中映射两个不同长度的列表?

linux - python subprocess.run 如果你重新定向 stdout/stderr,它会错误退出而不是工作

Java多线程作用域Thread.sleep

PyCharm 上的 Python 崩溃并显示 'Process finished with exit code -1073740940 (0xC0000374)'

python - 使用参数 'vote' ', '(' app1/(?P<question_id>[0-9]+)/vote/$'] 反转 )' not found. 1 pattern(s) tried: ['