在映射中使用本地函数时出现Python值错误
我正在尝试制作一个包含不同函数处理过的数据的列表。下面的代码不起作用,因为两个函数a和b不在map函数的范围内在映射中使用本地函数时出现Python值错误,python,function,namespaces,Python,Function,Namespaces,我正在尝试制作一个包含不同函数处理过的数据的列表。下面的代码不起作用,因为两个函数a和b不在map函数的范围内 def outer_func(): def a(): return "Something" def b(): return "Something else" map(lambda x: eval(x)(), ['a', 'b']) 我尝试将函数包装在一个类中,下面的代码工作得很好 class fcontainer():
def outer_func():
def a():
return "Something"
def b():
return "Something else"
map(lambda x: eval(x)(), ['a', 'b'])
我尝试将函数包装在一个类中,下面的代码工作得很好
class fcontainer():
def a(self):
return "Something"
def b(self):
return "Something else"
def test():
f = fcontainer()
return map(lambda x: getattr(f, x)(), ['a', 'b'])
现在,我的问题是:
functions = [eval(i) for i in ['a', 'b']]
return map(lambda x: x(), functions)
这是可行的,但它是两行而不是一行:|是否需要字符串列表(
['a','b']
)?也许您最好将函数对象直接放入列表中:[a,b]
return map(lambda x: x(), [a, b])
对我来说似乎很容易
如果你想作为装饰师来做,那就简单多了:
def outer_func():
funcs = []
def funcapp(func): # so that a and b are still in place...
funcs.append(func)
return func
@funcapp
def a():
return "Something"
@funcapp
def b():
return "Something else"
return funcs
是否需要一个字符串列表(
['a','b']
)?也许您最好将函数对象直接放入列表中:[a,b]
return map(lambda x: x(), [a, b])
对我来说似乎很容易
如果你想作为装饰师来做,那就简单多了:
def outer_func():
funcs = []
def funcapp(func): # so that a and b are still in place...
funcs.append(func)
return func
@funcapp
def a():
return "Something"
@funcapp
def b():
return "Something else"
return funcs
您需要确保
eval
在正确的上下文中执行,方法是将globals
和locals
置于outer_func()
内部
话虽如此,
eval
可能不是您问题的解决方案您需要确保eval
在正确的上下文中执行,方法是将globals
和locals
内部外部函数()
话虽如此,
eval
可能不是python中问题的解决方案,我们有一个特殊功能,您可以像传递变量一样传递函数
你的第一个方法几乎是正确的,。。略漏:)
eval真的很好,但正如你所面临的,它有风险
如果将此用于第二种方法,它将起作用
>>> def test():
... f = fcontainer()
... return map(lambda x: x(), [f.a, f.b])
...
>>> test()
['Something', 'Something else']
现在,请回答您的问题:
Q1。为什么地图功能中不存在a和b?
地图功能是特殊的。它不关心超出其范围的事情。这使它更快。检查下面的代码以理解
>>> dir() # used to check local variables/function defined already.
['__builtins__', '__doc__', '__name__', '__package__', 'outer_func']
>>> map( lambda x: dir() , range(5))
[['x'], ['x'], ['x'], ['x'], ['x']]
>>> # as you can see within MAP, outer_func is missing.
Q2。有没有一种“正确”的方法来完成我想做的事情?
有一种更简单的方法:)
Q3。我是否应该最终坐下来和装饰师们打交道?
我想你现在已经得到答案了。所以现在没有装饰
希望这对您有所帮助:)在python中,我们有一个特殊功能,您可以像传递变量一样传递函数 你的第一个方法几乎是正确的,。。略漏:) eval真的很好,但正如你所面临的,它有风险 如果将此用于第二种方法,它将起作用
>>> def test():
... f = fcontainer()
... return map(lambda x: x(), [f.a, f.b])
...
>>> test()
['Something', 'Something else']
现在,请回答您的问题:
Q1。为什么地图功能中不存在a和b?
地图功能是特殊的。它不关心超出其范围的事情。这使它更快。检查下面的代码以理解
>>> dir() # used to check local variables/function defined already.
['__builtins__', '__doc__', '__name__', '__package__', 'outer_func']
>>> map( lambda x: dir() , range(5))
[['x'], ['x'], ['x'], ['x'], ['x']]
>>> # as you can see within MAP, outer_func is missing.
Q2。有没有一种“正确”的方法来完成我想做的事情?
有一种更简单的方法:)
Q3。我是否应该最终坐下来和装饰师们打交道?
我想你现在已经得到答案了。所以现在没有装饰
希望这对你有帮助:)为什么要为你自己的课程操心呢<代码>@myList.append@Eric有时我们倾向于监督最简单的事情。谢谢。尽管如此,使用
@myList.append
会导致a
变为None
,但在本例中并非如此matter@Eric好的,这就是为什么做这个改变是可以的。谢谢你给出了一个非常有启发性的答案!返回映射(lambda x:x(),[a,b])确实做到了这一点,而且非常漂亮和干净!我猜我的是另一个忽视最简单事物的例子:)。为什么要为自己的课操心呢<代码>@myList.append@Eric有时我们倾向于监督最简单的事情。谢谢。尽管如此,使用@myList.append
会导致a
变为None
,但在本例中并非如此matter@Eric好的,这就是为什么做这个改变是可以的。谢谢你给出了一个非常有启发性的答案!返回映射(lambda x:x(),[a,b])确实做到了这一点,而且非常漂亮和干净!我猜我的是另一个忽视最简单事物的例子:)。谢谢你的回答!在此之前,我一直不明白必须向eval提供当地人作为论据的意义。谢谢你的回答!在此之前,我从未理解必须提供当地人作为eval的论据的意义。