当前位置: 首页 > 面试题库 >

Python中可能有真正的动态和匿名函数?

熊锐进
2023-03-14
问题内容

正如可以使用type(name,base-classes,namespace-dict)创建动态类一样,可以创建动态函数吗?

我尝试按照以下方式做一些事情:

>>> f = type("f", (function,), {})
NameError: name 'function' is not defined

好吧,所以我会很聪明,但是:

>>> def fn():
...   pass
... 
>>> type(fn)
<type 'function'>
>>> f = type("f", (type(fn),), {})
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: type 'function' is not an acceptable base type

Python是否以允许动态类的相同方式 专门 阻止动态函数的创建?

编辑:注意,我将禁止使用exec。由于我的问题是Python语言本身是否允许这样做。

提前致谢。


问题答案:

还有types.FunctionType,你可以用它来动态地创建的功能,例如

def test_func(): print 'wow' 
dynf = types.FunctionType(test_func.func_code, {})
dynf()

输出:

wow

您可能会反对这不是动态的,因为我正在使用另一个函数的代码,但这仅是示例,这里有一种从python字符串生成代码的方法,例如

dynf = types.FunctionType(compile('print "really WoW"', 'dyn.py', 'exec'), {})
dynf()

输出:

really WoW

现在,这是动态的!

OP担心此类功能的动态性,因此这是另一个示例

dynf = types.FunctionType(compile('test_func():\ntest_func()', 'dyn.py', 'exec'), globals())
dynf()

输出:

wow
wow

注意:像这样创建Function对象似乎有局限性,例如,传递参数并不容易,因为要传递参数,我们需要将正确的co_argcount,co_varnames和其他12个变量传递给types.CodeType,理论上可以做到,但是容易出错,更简单的方法是将字符串作为模块导入,并且您具有完整的功能,例如

import types
import sys,imp

code = """def f(a,b,c):
    print a+b+c, "really WoW"
"""
module = imp.new_module('myfunctions')
exec code in module.__dict__
module.f('W', 'o', 'W')

输出:

WoW really WoW


 类似资料:
  • 本文向大家介绍Python中的匿名函数,包括了Python中的匿名函数的使用技巧和注意事项,需要的朋友参考一下 这些函数被称为匿名函数,因为它们不是通过使用def关键字以标准方式声明的。您可以使用lambda关键字创建小的匿名函数。 Lambda形式可以接受任意数量的参数,但仅以表达式形式返回一个值。它们不能包含命令或多个表达式。 匿名函数不能直接调用print,因为lambda需要一个表达式 L

  • 本文向大家介绍使用Python中的匿名函数的打印能力?,包括了使用Python中的匿名函数的打印能力?的使用技巧和注意事项,需要的朋友参考一下 在这里,我们在内置函数内部使用了匿名(lambda)函数。在Python中,匿名函数是不带名称的,它是使用lambda关键字定义的。 算法 范例程式码 输出结果

  • 本文向大家介绍JavaScript中匿名、命名函数的性能测试,包括了JavaScript中匿名、命名函数的性能测试的使用技巧和注意事项,需要的朋友参考一下 我们经常通过匿名函数(Anonymous function)来写回调。 简单来讲匿名即没有名字的函数,一般都立即执行。但是它与命名函数(有名字的函数)的性能如何呢? 我们可以比较一下,我们随便找一台可以执行Shell命令的计算机来使用大量函数调

  • 本文向大家介绍深入浅析python 中的匿名函数,包括了深入浅析python 中的匿名函数的使用技巧和注意事项,需要的朋友参考一下 定义 匿名函数指一类无须定义标识符的函数或子程序。Python用lambda语法定义匿名函数,只需用表达式而无需申明。 lambda语法的定义如下: 匿名函数就是没有实际名称的函数。其主体仅仅是一个表达式,而不需要使用代码块。 <函数对象名> = lambda   <

  • 问题内容: 我需要创建一个“真实的”动态JPA 。我得到的陈述。看起来像: 这是我实现的: 我试图构建一个big ,其中包含所有其他谓词,并将其添加到中,但这些谓词再次覆盖旧值。似乎没有可能添加而不是更改谓词:-( 实际的项目更加复杂,因为有些对需要使用,而另一些需要使用。但这还不够:可能有一个额外的声明,如like 。在这里,值必须拆分并创建如下语句: UPDATE和SOLUTION 得到两个列

  • 本文向大家介绍JavaScript中的匿名函数和内联函数有什么区别?,包括了JavaScript中的匿名函数和内联函数有什么区别?的使用技巧和注意事项,需要的朋友参考一下 匿名函数 顾名思义,匿名允许创建没有任何名称标识符的函数。它可以用作其他函数的参数。这就是可以使用JavaScript匿名函数的方式- 另一个示例可以如下- 内联函数 一个内联 函数是一个javascript函数,其被分配给在运