プロキシクラスは子のメソッドを呼び出すことができません

ロブ

私は、ETL(データ移動)ワークフローのフレームワークであるpetlと呼ばれるパッケージから別のクラスをラップ/装飾/拡張するPythonクラスを作成しています。設計上の制約のため、サブクラス化することはできません。返されるオブジェクトの種類を制御できるように、すべてのメソッド呼び出しは自分のクラスを介して送信する必要があります。したがって、原則としてこれはプロキシクラスですが、既存の回答/レシピを使用するのに問題があります。これは私のコードがどのように見えるかです:

from functools import partial

class PetlTable(object):
    """not really how we construct petl tables, but for illustrative purposes"""
    def hello(name):
        print('Hello, {}!'.format(name)

class DatumTable(object):
    def __init__(self, petl_tbl):
        self.petl_tbl = petl_tbl

    def __getattr__(self, name):
        """this returns a partial referencing the child method"""

        petl_attr = getattr(self.petl_tbl, name, None)

        if petl_attr and callable(petl_attr):
            return partial(self.call_petl_method, func=petl_attr)

        raise NotImplementedError('Not implemented')

    def call_petl_method(self, func, *args, **kwargs):
        func(*args, **kwargs)

次に、テーブルをインスタンス化して何かを呼び出そうとします。

# create a petl table
pt = PetlTable()

# wrap it with our own class
dt = DatumTable(pt)

# try to run the petl method
dt.hello('world')

これにより、が得られますTypeError: call_petl_method() got multiple values for argument 'func'

これは、位置引数でのみ発生します。kwargsは問題ないようです。私はそれがself渡されないことに関係しているとかなり確信していますが、解決策が何であるかはわかりません。誰かが私が間違っていること、または完全に良い解決策を考えることができますか?

ロブ

これは、位置引数とキーワード引数の混合に関する一般的な問題のようです。TypeError:引数に複数の値を取得しました

それを回避するために、私は位置引数をfunc取り出してcall_petl_method、子関数のkwargと重複する可能性が低いkwargに配置しました。少しハッキーですが、動作します。

Proxyはこれらすべてを一般的に行うためのクラスを書くことになりました

class Proxy(object):
    def __init__(self, child):
        self.child = child

    def __getattr__(self, name):
        child_attr = getattr(self.child, name)
        return partial(self.call_child_method, __child_fn__=child_attr)

    @classmethod
    def call_child_method(cls, *args, **kwargs):
        """
        This calls a method on the child object and wraps the response as an
        object of its own class.

        Takes a kwarg `__child_fn__` which points to a method on the child
        object.

        Note: this can't take any positional args or they get clobbered by the
        keyword args we're trying to pass to the child. See:
        https://stackoverflow.com/questions/21764770/typeerror-got-multiple-values-for-argument
        """

        # get child method
        fn = kwargs.pop('__child_fn__')

        # call the child method
        r = fn(*args, **kwargs)

        # wrap the response as an object of the same class
        r_wrapped = cls(r)

        return r_wrapped

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

別のクラス内でクラスメソッドを呼び出すことはできません

分類Dev

子クラスのオブジェクトは独自のメソッドを呼び出すことができません

分類Dev

子クラスのオブジェクトは独自のメソッドを呼び出すことができません

分類Dev

Javaは別のクラスからメソッドを呼び出すときにシンボルを見つけることができません

分類Dev

親は子クラスのメソッドを呼び出すことができますか?

分類Dev

C# consoleApp は別のクラスで静的メソッドを呼び出すことはできません

分類Dev

DBus の 2 番目のクラスのメソッドを呼び出すことができません

分類Dev

Androidで別のクラスのメソッドを呼び出すことはできません

分類Dev

すべての基本クラスで同じメソッドを呼び出すことはできません

分類Dev

カスタムConstraintLayoutクラスのメソッドを呼び出すことができませんか?

分類Dev

Swiftで特定のObjective-Cクラスメソッドを呼び出すことができません

分類Dev

ReactNativeの別のクラスからメソッドを呼び出すことができません

分類Dev

Javaで他のクラスからメソッドを呼び出すことはできません

分類Dev

Javaのクラスでvoidメソッドを呼び出すことはできません

分類Dev

JavaScriptで親クラスのメソッドを呼び出すことはできません

分類Dev

Repast:ContextBuilderの別のクラスからメソッドを呼び出すことはできません

分類Dev

他のクラスのメソッドを呼び出すことはできません

分類Dev

別のクラスのメソッドを呼び出すことはできません-ANDROID

分類Dev

フォームのクラスからメソッドを呼び出すことができません

分類Dev

キャッチされないエラー:初期化の前にプログレスバーのメソッドを呼び出すことはできません。メソッド 'value'を呼び出そうとしました

分類Dev

Kotlin基本クラスを拡張するJavaクラスは、baseの内部メソッドを呼び出すことができません

分類Dev

codeigniter で別のコントローラーメソッドを呼び出すことができません

分類Dev

StAXOMBuilder()クラスで保護されたメソッドを呼び出すことができません

分類Dev

クラスで定義されたメソッドを呼び出すことができません

分類Dev

派生クラスで仮想保護メソッドを呼び出すことができません

分類Dev

JavaCalculatorプログラムのMainメソッドで複数のメソッドを呼び出すことができません

分類Dev

未定義のプロパティを読み取ることができません-クラス内のメソッド呼び出し

分類Dev

配列型(クラス)MitarbeiterListe []でメソッドgetSize()を呼び出すことはできません

分類Dev

クラス内でメソッドを呼び出すことはできません

Related 関連記事

  1. 1

    別のクラス内でクラスメソッドを呼び出すことはできません

  2. 2

    子クラスのオブジェクトは独自のメソッドを呼び出すことができません

  3. 3

    子クラスのオブジェクトは独自のメソッドを呼び出すことができません

  4. 4

    Javaは別のクラスからメソッドを呼び出すときにシンボルを見つけることができません

  5. 5

    親は子クラスのメソッドを呼び出すことができますか?

  6. 6

    C# consoleApp は別のクラスで静的メソッドを呼び出すことはできません

  7. 7

    DBus の 2 番目のクラスのメソッドを呼び出すことができません

  8. 8

    Androidで別のクラスのメソッドを呼び出すことはできません

  9. 9

    すべての基本クラスで同じメソッドを呼び出すことはできません

  10. 10

    カスタムConstraintLayoutクラスのメソッドを呼び出すことができませんか?

  11. 11

    Swiftで特定のObjective-Cクラスメソッドを呼び出すことができません

  12. 12

    ReactNativeの別のクラスからメソッドを呼び出すことができません

  13. 13

    Javaで他のクラスからメソッドを呼び出すことはできません

  14. 14

    Javaのクラスでvoidメソッドを呼び出すことはできません

  15. 15

    JavaScriptで親クラスのメソッドを呼び出すことはできません

  16. 16

    Repast:ContextBuilderの別のクラスからメソッドを呼び出すことはできません

  17. 17

    他のクラスのメソッドを呼び出すことはできません

  18. 18

    別のクラスのメソッドを呼び出すことはできません-ANDROID

  19. 19

    フォームのクラスからメソッドを呼び出すことができません

  20. 20

    キャッチされないエラー:初期化の前にプログレスバーのメソッドを呼び出すことはできません。メソッド 'value'を呼び出そうとしました

  21. 21

    Kotlin基本クラスを拡張するJavaクラスは、baseの内部メソッドを呼び出すことができません

  22. 22

    codeigniter で別のコントローラーメソッドを呼び出すことができません

  23. 23

    StAXOMBuilder()クラスで保護されたメソッドを呼び出すことができません

  24. 24

    クラスで定義されたメソッドを呼び出すことができません

  25. 25

    派生クラスで仮想保護メソッドを呼び出すことができません

  26. 26

    JavaCalculatorプログラムのMainメソッドで複数のメソッドを呼び出すことができません

  27. 27

    未定義のプロパティを読み取ることができません-クラス内のメソッド呼び出し

  28. 28

    配列型(クラス)MitarbeiterListe []でメソッドgetSize()を呼び出すことはできません

  29. 29

    クラス内でメソッドを呼び出すことはできません

ホットタグ

アーカイブ