假设我创建了一个包含许多函数和其他东西的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
您想帮我解决这个问题吗?
答案 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);
}
}
作为旁注,我建议不要评估任意代码,特别是如果它来自其他来源/模块,因为它可能会意外地包含有害代码。