在映射中使用本地函数时出现Python值错误

在映射中使用本地函数时出现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():

我正在尝试制作一个包含不同函数处理过的数据的列表。下面的代码不起作用,因为两个函数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 a(self):
        return "Something"

    def b(self):
        return "Something else"

def test():
    f = fcontainer()
    return map(lambda x: getattr(f, x)(), ['a', 'b'])
现在,我的问题是:

  • 为什么映射函数中不存在a和b
  • 有没有一种“正确”的方式来做我想做的事情
  • 我是否应该最终坐下来和装饰师们打交道?:) 谢谢大家!

    更新:第一个示例可以通过在outer_func范围内首先获取函数,然后使用map:

    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的论据的意义。