4

これを行う方法があるに違いないことはわかっています。しかし、「TypeError: 最初の引数は呼び出し可能でなければなりません」というエラーが表示されます。

これを機能させるには、どうすればよいでしょうか?

class FaxMachine(object):
    MODEL_NO = '100'

    @staticmethod
    def load_fax(fax, error=''):
        # send fax here

    fail_fax = functools.partial(load_fax, error='PC LOAD LETTER')
4

3 に答える 3

4

staticmethodオブジェクトは呼び出し可能ではありません。これらは、元の関数への参照を属性に保持する記述子です。__func__

したがって、次のように動作します。

# Note: apply staticmethod again
fail_fax = staticmethod(partial(load_fax.__func__, error='PC LOAD LETTER'))

クラスの名前空間にヘルパー関数を定義して、不要な属性検索を回避することもできます。

def _load_fax(fax, error=''):
    # ...

# _load_fax is an ordinary function
load_fax = staticmethod(_load_fax)
fail_fax = staticmethod(partial(_load_fax, error='PC LOAD LETTER'))

正しい Python 3.4+ ソリューションは、partialmethod記述子を操作するように設計されたを使用することですが、

fail_fax = partialmethod(load_fax, error='PC LOAD LETTER')
于 2016-04-28T18:21:33.107 に答える
3

「呼び出された」ときのメソッドと関数の動作は異なります。関数は、を使用して直接呼び出されますが__call__、メソッド(通常はメソッドではなく、記述子のみだと思います)はによって呼び出され__get__ます。

したがって、functools-module には別のpartialfor メソッドが含まれています: functools.partialmethod:

functools.partialmethod(load_fax, error='PC LOAD LETTER')

公式ドキュメントには、特に に関する非常に優れた説明が含まれていstaticmethodます。

于 2016-04-28T18:27:41.873 に答える
2

おそらくもっとスマートな方法がありますが、これはうまくいくようです。

import functools

class FaxMachine(object):
    MODEL_NO = '100'

    @staticmethod
    def load_fax(fax, error=''):
        print error or fax

FaxMachine.fail_fax = functools.partial(FaxMachine.load_fax, error='PC LOAD LETTER')

f = FaxMachine()
f.load_fax('hi')
f.fail_fax('hi')
于 2016-04-28T18:32:49.863 に答える