如何通过另一个文件中另一个文件定义的变量在文件中使用包含eval的函数?

时间:2016-05-30 21:53:00

标签: python python-3.x eval

假设我创建了一个包含许多函数和其他东西的python文件(FirstFile.py)名称。其中一个功能是(当然,它是简化的):

def func(string):
    assert eval(string)

此外,我已经创建了一个python文件,它从上面提到的文件中导入func()。然后第二个python文件尝试执行以下过程:

from FirstFile import func
amk = 1
func("amk == 1")

当变量“amk”在第一个文件中时,不会显示任何问题。但是,当变量“amk”位于第二个文件中时(如此处所示),会显示错误:

NameError: name 'amk' is not defined 

您想帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

默认情况下eval("x == 1", {"x":1}) 在当前本地/全局范围内执行,如果要指定其他环境,可以执行以下操作:

environ

所以你的函数可以采用一个可选的def func(string, environ=None): assert eval(string, environ) 参数:

locals()

然后你可以从另一个传递from FirstFile import func amk = 1 func("amk == 1", locals()) 的模块中调用该函数作为环境:

public class ValidateRenderingIdAttribute : ActionMethodSelectorAttribute
{
    public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo)
    {
        var ignoreCase = StringComparison.InvariantCultureIgnoreCase;

        var httpRequest = controllerContext.HttpContext.Request;
        var isWebFormsForMarketersRequest = httpRequest.Form.AllKeys
          .Any(key => key.StartsWith("wffm", ignoreCase) && key.EndsWith("Id", ignoreCase));

        if (isWebFormsForMarketersRequest)
        {
            return false;
        }
        string renderingId;
        if (!httpRequest.GetHttpMethodOverride().Equals(HttpVerbs.Post.ToString(), ignoreCase) || string.IsNullOrEmpty(renderingId = httpRequest.Form["uid"]))
        {
            return true;
        }

        var renderingContext = RenderingContext.CurrentOrNull;
        if (renderingContext == null)
        {
            return false;
        }

        Guid id;
        return Guid.TryParse(renderingId, out id) && id.Equals(renderingContext.Rendering.UniqueId);
    }
}

作为旁注,我建议不要评估任意代码,特别是如果它来自其他来源/模块,因为它可能会意外地包含有害代码。