1

Python では、class ステートメントなしでクラスを作成できます。

MyClass = type('X', (object,), dict(a=1))

「def」なしで関数を作成する方法はありますか? それは私が得た限り...

d={} # func from string
exec'''\
def synthetics(s):
    return s*s+1
''' in d

>>> d.keys()
['__builtins__', 'synthetics']
>>> d['synthetics']
<function synthetics at 0x00D09E70>
>>> foo = d['synthetics']
>>> foo(1)
2
4

2 に答える 2

6

技術的には、はい、これは可能です。関数の型は、他のすべての型と同様に、その型のインスタンスのコンストラクターです。

FunctionType = type(lambda: 0)
help(FunctionType)

ヘルプからわかるように、最低限のコードとグローバルが必要です。前者はコンパイル済みのバイトコード オブジェクトです。後者は辞書です。

コード オブジェクトを作成するには、コード タイプのコンストラクターを使用できます。

CodeType = type((lambda: 0).func_code)
help(CodeType)

ヘルプは、これは「気弱な人向けではない」と言っていますが、それは本当です. このコンストラクターには、バイトコードとその他の要素を渡す必要があります。したがって、コード オブジェクトを取得する最も簡単な方法は、別の関数から、または関数を使用するcompile()ことです。しかし、Python バイトコードを十分に理解していれば、コード オブジェクトを完全に合成的に生成することは技術的に可能です。(デコレーターで使用する署名を保持するラッパー関数を構築するために、非常に限定的にこれを行いました。)

PS --また、モジュール経由FunctionTypeCodeTypeも利用できます。types

于 2012-09-20T13:20:54.403 に答える
2

以下よりも直接的な方法があるかもしれませんが、ここでは を使用しない本格的な関数を示しdefます。まず、単純なlambda式を使用して関数オブジェクトを取得します。

>>> func = lambda: None

次に、compileコード オブジェクトを取得し、それを使用してlambdaのコードを置き換えるソース コード:

>>> func.__code__ = compile("print('Hello, world!')", "<no file>", "exec")
>>> func()
Hello, world!
于 2012-09-20T13:12:40.963 に答える