【问题标题】:Using exec()/compile() with user input将 exec()/compile() 与用户输入一起使用
【发布时间】:2018-10-02 01:43:09
【问题描述】:

如果我使用compile()exec()来执行用户输入的一些代码,代码中定义的函数或变量可以在外面再次使用吗?
例如:

code = ""
while 1:
    line = input("")
    if line == "":
        break
    code += line

exec(compile(code, "code", "exec"))
print(test()+1)

这不会像我预期的那样返回6。它给出了NameError,但编译或执行代码没有问题。如果代码只是一个字符串而不是输入,则没有错误。有没有办法使用test()这个功能?

【问题讨论】:

    标签: python function input


    【解决方案1】:

    变量名称解析和作用域是在编译时完成的,因此如果在运行时使用exec 定义变量/函数名称,则需要使用locals() dict 来引用它:

    exec(compile(code, "code", "exec"))
    print(locals()['test']()+1)
    

    【讨论】:

    • 谢谢这个工作,有没有办法在输入中使用我的代码中的变量/函数?
    • 是的,您可以使用globals()locals() 传递给它来调用它:exec(compile(code, "code", "exec"), globals(), locals())
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-09
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 2012-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多