13

関数が空の定義かどうかを検出する必要があります。次のようになります。

def foo():
    pass

または好き:

def foo(i, *arg, **kwargs):
    pass

または好き:

foo = lambda x: None

「検査」モジュールを使用してそれらを検出する最もエレガントな方法は何ですか? これよりも良い方法はありますか:

def isEmptyFunction(func):
    e = lambda: None
    return func.__code__.co_code == e.__code__.co_code
4

4 に答える 4

4

docstring を持つ空の関数のバイトコードはわずかに異なるため、提案した方法はうまく機能しません。

func.__code__.co_codedocstring のない空の関数の の値'd\x00\x00S'は であり、docstring のある関数の の値は です'd\x01\x00S'

私の目的では、テストする追加のケースを追加するだけで機能します。

def isEmptyFunction(func):
    def empty_func():
        pass

    def empty_func_with_doc():
        """Empty function with docstring."""
        pass

    return func.__code__.co_code == empty_func.__code__.co_code or \
        func.__code__.co_code == empty_func_with_doc.__code__.co_code
于 2014-07-11T04:05:24.260 に答える
0

あなたが使っている方法はうまくいきます。おそらくより「エレガントな」解決策は、関数のリストを持ち、すべての空の(または空でないすべての)関数でそれをリストに追加し、関数がリストにあるかどうかを確認することです.

于 2012-12-03T04:58:37.917 に答える
-4

どうしてそうするか?悪いデザインのようです。私はあなたが何かをより速くしないと確信しています。

python -m timeit -s'def a(): pass' -s'def b(): pass' 'if a.__code__.co_code == b.__code__.co_code: pass'
1000000 loops, best of 3: 0.293 usec per loop

python -m timeit -s 'def a(): pass' -s 'def b(): pass' 'a()'
10000000 loops, best of 3: 0.0941 usec per loop

後者の時間には10倍のループがあったため、単に呼び出すよりも比較する方がはるかに遅いようです。equals 演算子は実際には a を呼び出します。コード.co_code. 等式。だから、物事を遅くしているだけです。

于 2013-01-05T09:54:34.363 に答える