代码之家  ›  专栏  ›  技术社区  ›  Cyker

匿名函数中的python:`with`语句

  •  0
  • Cyker  · 技术社区  · 7 年前

    可以用吗 with python匿名函数中的语句?例如,我有一个函数可以写 1 文件:

    def write_one(filename):
        with open(filename, 'wt') as fp:
            fp.write('1')
    

    但这项职能将以口述的形式组织:

    my_functions = {
        ....
    }
    

    显然,我可以编写这个语句来将这个函数添加到dict中:

    my_functions['write_one'] = write_one
    

    但问题是名字 write_one 仍存在于当前范围中。如何在不污染当前命名空间的情况下引入匿名函数?

    对于简单的函数,我可以使用 lambda . 对于稍微复杂的函数,我可以返回一个元组来执行多个语句(精确地说,表达式)。但我找不到一个聪明的方法 lambda 以便它能与 具有 声明。如果这是不可能的,它在文档中怎么说?

    解决方案 del write_one 我觉得不好。我不希望在当前名称空间中引入这个名称。

    总之,我想要的是这样的:

    my_functions['write_one'] = def(filename):
        with open(filename, 'wt') as fp:
            fp.write('1')
    

    我知道,这对于Python基于缩进的规则有点笨拙。但它确实发挥了作用。

    2 回复  |  直到 7 年前
        1
  •  4
  •   juanpa.arrivillaga    7 年前

    lambda表达式的功能非常有限。从 docs

    请注意,使用lambda表达式创建的函数不能包含语句或批注。

    只需使用完整的函数定义。如果您真的想避免污染名称空间,只需 del 后面的名字。

    或者,如果您只是想避免模块名称空间具有一系列用于代码完成的小函数,请使用 _ 在函数名的前面。

    如果你真的想避免它,你 能够 使用 function 构造器和动态编译代码等,或使用其他类型的动态代码执行,例如使用 eval 或 exec . 但这几乎肯定不值得麻烦。 尤其是如果你能 德尔 完成使用后的名称。

    或者最好的方法是将所有这些函数放到另一个名称空间中,就像另一个模块一样。

        2
  •  1
  •   kabanus    7 年前

    python中没有太多的名称空间——函数基本上就是本地名称空间。这为可能的解决方案提供了一个很好的提示:

    def gen_functions():
        def f1(i):
            print(i)
        def f2(i):
            print(i+1)
        return f1,f2
    
    my_funcs = dict(zip(('a','b'),gen_functions()))
    my_funcs['a'](2)
    my_funcs['b'](7)
    f1(3)
    

    运行此操作:

    >py bla.py
    2
    8
    Traceback (most recent call last):
      File "bla.py", line 11, in <module>
        f1(3)
    NameError: name 'f1' is not defined
    

    因此,您可以任意创建复杂的函数——为了将它们隐藏在全局名称空间中,只需将它们包含在另一个函数中。