Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如果不使用'def'关键字,我们如何定义函数?_Python_Python 3.x_Function - Fatal编程技术网

Python 如果不使用'def'关键字,我们如何定义函数?

Python 如果不使用'def'关键字,我们如何定义函数?,python,python-3.x,function,Python,Python 3.x,Function,可以在不使用class关键字的情况下定义类。 以下是 get_i = lambda self: self.i get_i.__name__ = 'get_i' get_i.__qualname__ = 'Klass2.get_i' dct = dict(a=1, i=4, get_i=get_i) Klass2 = type('Klass2', (SuperK,), dct) 。。。产生与以下相同的最终结果: class Klass1(SuperK): a = 1

可以在不使用
class
关键字的情况下定义类。
以下是

get_i = lambda self: self.i    
get_i.__name__ = 'get_i'
get_i.__qualname__ = 'Klass2.get_i'
dct = dict(a=1, i=4, get_i=get_i)    
Klass2 = type('Klass2', (SuperK,), dct)
。。。产生与以下相同的最终结果:

class Klass1(SuperK):
    a = 1
    i = 4
    def get_i(self):
        return self.i
我们如何对函数执行类似的操作?也就是说,如果不使用
def
lambda
关键字,我们如何定义函数?如果下面两段代码创建了相同的
foo
s,那么
dehf
的纯python实现会是什么样子

def foo(bar):
    bar += 934
    return bar

foo = dehf(blah, blah, blah, blah, [...])

您可以通过调用构造函数来创建函数。但是请记住,此构造函数没有文档记录,并且是特定于实现的。在CPython中,我们可以通过调用
help(types.FunctionType)
来计算构造函数参数:

要创建代码对象,我们可以使用:


您使用
lambda
来定义类中的函数。为什么您认为您可以定义一个没有
lambda
的函数?使用
type
创建类的用例非常罕见(比如元类)。但是为什么要创建一个没有
def
lambda
的函数呢?我想如果您想让代码无法维护,这可能是个好主意。但是IRL有什么好的理由让你想使用如此迟钝的方式来定义一个类或一个函数呢?@Chris_Rands@barny一个用例是在运行时用生成的名称创建函数。例如,假设我们想在运行时创建一个名为
baz
的函数,但我们不知道在编写代码时它会被命名为
baz
。因此,我们不能简单地编写
defbaz(*args):
。可能有一个decorator,它输出一个名为“
pretty
”的函数,其中的函数传递给decorator。您可以编写,
func.\uuu name=“pretty\uu”+foo.\uu name\uuu
,但是在没有
def
-关键字的情况下构造函数也有其他的用例,它们不那么容易处理。如果您的问题是关于动态创建函数名,那么可以问这个问题,你仍然可以使用
def
例如,目前它感觉像是一个XY问题,很有趣,但这不是一个XY问题,你为什么要这样做?@Chris_Rands不知道,你必须问OP。也许这只是简单的好奇:)我有一个用例,有点像。我有一个模块,在模块范围内生成一组函数。它工作正常,只是完全混淆了IDE和代码验证工具。所以我需要为每个函数添加一个存根,这些存根可以用类似于您的示例的东西更简洁地表示。
class function(object)
 |  function(code, globals[, name[, argdefs[, closure]]])
 |  
 |  Create a function object from a code object and a dictionary.
 |  The optional name string overrides the name from the code object.
 |  The optional argdefs tuple specifies the default argument values.
 |  The optional closure tuple supplies the bindings for free variables.
code = compile('print(5)', 'foo.py', 'exec')
function = types.FunctionType(code, globals())

function()  # output: 5