変数を使用して関数シグネチャの引数のリストを定義するにはどうすればよいですか?

madt1m

run基本クラスの関数をオーバーライドする関数を使用して、Python3.7でクラスを開発していますrun()機能は例えば、引数の正確な数で定義する必要がありdef run(self, a, b)、それが定義されていますどのように多くの引数に基づいて異なる動作をします-関数が呼び出されたときにその署名は、関数に右引数の数を提供するために、検査が行われます。私の設計では、引数の数(および名前)は、インスタンスが構築されるときにクラスに渡されます。

私は、次のようなモジュールを見下ろしていましたしないてきたfunctoolsなどのソリューション*args**kwargs、しかし、私は彼らが私のシナリオでは動作しません恐れて、私は「バインド」にしたくないので、関数を呼び出す前に、任意の変数、どちらも私は可変引数リストをしたいですか。関数の引数の固定リストが必要ですが、クラスに提供されている変数を使用して関数を定義する必要があります:)

私の期待する結果を表示する方がおそらくはるかに簡単です。

>>>args1 = ['arg1', 'arg2']
>>>args2 = ['arg1', 'arg2', 'arg3']

...
...

>>>c1 = MyClass(run_args=args1)
>>>c2 = MyClass(run_args=args2)
>>>import inspect
>>>inspect.getargspec(c1.run)
ArgSpec(args=['self', 'arg1', 'arg2'], varargs=None, keywords=None, defaults=None)
>>>inspect.getargspec(c2.run)
ArgSpec(args=['self', 'arg1', 'arg2', 'arg3'], varargs=None, keywords=None, defaults=None)
セルジュバレスタ

同じクラスのオブジェクトは共通のメソッド、つまり共通のメソッドシグネチャを共有することが期待されるため、これはかなり奇妙な設計です。

ただし、Python3では、すべてのオブジェクトがメソッド名を使用して属性を定義でき、その属性はイディオムobj.method(args)が呼び出されたときに使用されます。そして、その属性が関数またはラムダである場合、シグネチャを持つことができます。

コンセプトを示すミニマリストコードは次のとおりです。

import abc
import inspect

class Base(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def run(self, *args):
        """Just an example to show what arguments have been passed"""
        print("run method called with", *args)

class Child(Base):
    def __init__(self, run_args):
        """run_args is the list of the names of the arguments of run"""
        params = [inspect.Parameter(n, inspect.Parameter.POSITIONAL_OR_KEYWORD)
                  for n in run_args]
        # self.run is a lambda calling Child.run, but has a specific signature
        self.run = lambda *args: Child.run(self, *args)
        self.run.__signature__ = inspect.Signature(params)
    def run(self, *args):
        # controls that the signature of self.run has been observed
        inspect.signature(self.run).bind(*args)
        # do the processing - here only call the base class method
        super().run(*args)

これで、テストできます。

>>> c1 = Child(['arg1', 'arg2'])
>>> c1.run(1,2)
run method called with 1 2
>>> c1.run(1,2,3)
Traceback (most recent call last):
...
TypeError: too many positional arguments
>>> c1.run(1)
Traceback (most recent call last):
  File "<pyshell#119>", line 1, in <module>
...
TypeError: missing a required argument: 'arg2'
>>> c2 = Child(['arg1', 'arg2', 'arg3'])
>>> c2.run(1,2,3)
run method called with 1 2 3
>>> c1.run(1,2)
run method called with 1 2

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

関数がチャイスクリプトで定義されているかどうかを確認するにはどうすればよいですか?また、型付き引数を使用して関数を実行するにはどうすればよいですか?

分類Dev

reason-reactを使用して、関数シグネチャで複数のタイプを受け入れるバインディングを定義するにはどうすればよいですか?

分類Dev

デフォルトの引数値を含む関数のシグネチャを読み取るにはどうすればよいですか?

分類Dev

リストの出力値を適切に変換して、関数内の引数として使用するにはどうすればよいですか?

分類Dev

リストを関数の引数として「展開」するにはどうすればよいですか?

分類Dev

Elixir:リストを変数として使用して複数のマクロを定義するにはどうすればよいですか?

分類Dev

特定のシグネチャを使用して関数の概念を構築するにはどうすればよいですか?

分類Dev

デフォルトの引数を使用してstd :: function変数を定義するにはどうすればよいですか?

分類Dev

Vue変数を関数の引数と等しく設定するにはどうすればよいですか?

分類Dev

既存の関数を使用して、異なるデフォルトのオプションの引数を使用して新しい関数を定義するにはどうすればよいですか?

分類Dev

特定のシグネチャを持つ関数呼び出しのreturn_valueを設定するにはどうすればよいですか?

分類Dev

ggplot2関数を呼び出し、引数の中で変数名をとる関数を定義するにはどうすればよいですか?

分類Dev

関数の引数リストを変更するにはどうすればよいですか?

分類Dev

Pythonのクラス内の関数のすべての反復で使用される変数を定義するにはどうすればよいですか?

分類Dev

gmakeで整数のシーケンシャルリストである変数を定義するにはどうすればよいですか?

分類Dev

ジュリア:関数の引数の型をタプルの配列として定義するにはどうすればよいですか?

分類Dev

Scalaのすべての数値で関数をジェネリックとして定義するにはどうすればよいですか?

分類Dev

関数の引数として関数を使用するにはどうすればよいですか?

分類Dev

スライムを使用しているときにemacsの関数定義にジャンプするにはどうすればよいですか?

分類Dev

rlang :: fn_fmlsで変更した後、関数のシグネチャを更新するにはどうすればよいですか?

分類Dev

不明な数の変数を使用して関数を定義するにはどうすればよいですか?

分類Dev

PyParsingで、文字列のリストを整数のリストに変換するsetParseAction関数を定義するにはどうすればよいですか?

分類Dev

別の関数で定義されている関数で変数を使用するにはどうすればよいですか?

分類Dev

'overwritePermissions'関数を使用して、特定のチャネルのアクセス許可をオンにするにはどうすればよいですか?

分類Dev

Pythonで関数を定義した後、関数スコープ内の変数を変更するにはどうすればよいですか?

分類Dev

変数のリストでeval()関数を使用するにはどうすればよいですか?

分類Dev

可変個引数テンプレートの引数を保存できるクラスを定義するにはどうすればよいですか?

分類Dev

(Entry.get())として定義された変数をある関数から別の関数に渡すにはどうすればよいですか?

分類Dev

Javaに関連するfold()関数の関数シグネチャを実装するにはどうすればよいですか?

Related 関連記事

  1. 1

    関数がチャイスクリプトで定義されているかどうかを確認するにはどうすればよいですか?また、型付き引数を使用して関数を実行するにはどうすればよいですか?

  2. 2

    reason-reactを使用して、関数シグネチャで複数のタイプを受け入れるバインディングを定義するにはどうすればよいですか?

  3. 3

    デフォルトの引数値を含む関数のシグネチャを読み取るにはどうすればよいですか?

  4. 4

    リストの出力値を適切に変換して、関数内の引数として使用するにはどうすればよいですか?

  5. 5

    リストを関数の引数として「展開」するにはどうすればよいですか?

  6. 6

    Elixir:リストを変数として使用して複数のマクロを定義するにはどうすればよいですか?

  7. 7

    特定のシグネチャを使用して関数の概念を構築するにはどうすればよいですか?

  8. 8

    デフォルトの引数を使用してstd :: function変数を定義するにはどうすればよいですか?

  9. 9

    Vue変数を関数の引数と等しく設定するにはどうすればよいですか?

  10. 10

    既存の関数を使用して、異なるデフォルトのオプションの引数を使用して新しい関数を定義するにはどうすればよいですか?

  11. 11

    特定のシグネチャを持つ関数呼び出しのreturn_valueを設定するにはどうすればよいですか?

  12. 12

    ggplot2関数を呼び出し、引数の中で変数名をとる関数を定義するにはどうすればよいですか?

  13. 13

    関数の引数リストを変更するにはどうすればよいですか?

  14. 14

    Pythonのクラス内の関数のすべての反復で使用される変数を定義するにはどうすればよいですか?

  15. 15

    gmakeで整数のシーケンシャルリストである変数を定義するにはどうすればよいですか?

  16. 16

    ジュリア:関数の引数の型をタプルの配列として定義するにはどうすればよいですか?

  17. 17

    Scalaのすべての数値で関数をジェネリックとして定義するにはどうすればよいですか?

  18. 18

    関数の引数として関数を使用するにはどうすればよいですか?

  19. 19

    スライムを使用しているときにemacsの関数定義にジャンプするにはどうすればよいですか?

  20. 20

    rlang :: fn_fmlsで変更した後、関数のシグネチャを更新するにはどうすればよいですか?

  21. 21

    不明な数の変数を使用して関数を定義するにはどうすればよいですか?

  22. 22

    PyParsingで、文字列のリストを整数のリストに変換するsetParseAction関数を定義するにはどうすればよいですか?

  23. 23

    別の関数で定義されている関数で変数を使用するにはどうすればよいですか?

  24. 24

    'overwritePermissions'関数を使用して、特定のチャネルのアクセス許可をオンにするにはどうすればよいですか?

  25. 25

    Pythonで関数を定義した後、関数スコープ内の変数を変更するにはどうすればよいですか?

  26. 26

    変数のリストでeval()関数を使用するにはどうすればよいですか?

  27. 27

    可変個引数テンプレートの引数を保存できるクラスを定義するにはどうすればよいですか?

  28. 28

    (Entry.get())として定義された変数をある関数から別の関数に渡すにはどうすればよいですか?

  29. 29

    Javaに関連するfold()関数の関数シグネチャを実装するにはどうすればよいですか?

ホットタグ

アーカイブ