2016-09-21 13 views
2

私は比較的新しいPython学習者です。そのため、異なる符号化技術を通過、私はこの出くわしながら:パラメータと署名の使用

from inspect import Parameter, Signature 

def make_signature(names): 
    return Signature(Parameter(name, Parameter.POSITIONAL_OR_KEYWORD) for name in names) 

class Structure: 
    list_fields = [] 
    def __init__(self, *args): 
     for name, val in zip(self.list_fields, args): 
      setattr(self, name, val) 

class Stock(Structure): 
    __signature__ = make_signature(['name', 'shares', 'price']) 
    #list_fields = ['name', 'shares', 'price'] 

class Point(Structure): 
    list_fields = ['x', 'y'] 

obj2=Point(20,40) 
obj1=Stock('googl', 100, 8000) 
print(obj1.name) 

私はそれが__init__方法ですので、Structureクラスを継承しているPointクラスでStructureクラスとその統合を理解しています。しかし、Pointクラスのオブジェクトを作成すると、をサポートしません。位置引数では、Stockクラスオブジェクトがこの機能をサポートしています。

  • なぜ誰に教えてもらえますか?&どうしますか?
  • パラメータを使用する場合は、Signature?
  • また、これはメタプログラミングにどのように関連していますか?
  • このような例がさらにあります。
  • make_signature方法でParameterの機能をどのように使用しているのですか?make_signatureはどんな方法をしていますか?
  • プログラムのフロー、つまり、どの関数が誰に返されているのか(その逆も同様)。私の知る限り、StockクラスとPointクラスは、Structureクラスを呼び出していますが、いつmake_signatureメソッドが入っていますか?

そしてまた、私は何か良い説明を見つけることができなかった私は約Signatureいくつかのドキュメントを読むことを試みたが、これらの例は、この種のものではないと私は、このコードのドキュメンテーションをバックトラック迷子に保つように私のためのあまり重いものですPythonのメタプログラミングに関するドキュメンテーション

答えて

2

なぜ誰に教えてください。&これはどうしますか? Structure.__init__*argsによって決定されるよう

両方のクラス位置引数を受け入れる:

s = Stock('pos_arg1', 'pos_arg2', 'pos_arg3') 
p = Point('pos_arg1', 'pos_arg2', 'pos_arg3') 

を違いは、あなたがlist_fieldsをコメントアウトするので、ためStockが実際にに任意の引数を設定しないことですStructure.__init__は空のStructure.list_fieldsを使用します。そのため、Stockインスタンスのnameにアクセスしようとすると、AttributeErrorが発生します。

どちらの場合でも、どのような引数を設定できるかは、list_fields制限です。前のスニペットのPointインスタンスの場合、xpos_arg1に等しく、ypos_arg2に等しくなります。 pos_arg3は本質的に投げ込まれる。反復可能オブジェクトの一つが使い果たされるまで、これはタプルを構築zipによるものです:

for i, j in zip(['x', 'y'], ['pos_arg1', 'pos_arg2', 'pos_arg3']): 
    print(i, j) 

プリント:空のリストが供給されると

x pos_arg1 
y pos_arg2 

、それもループしません。あなたがStockを初期化するとき、これは、Structure.list_fields = []が使用されている何が起こるかです:

for i, j in zip([], ['pos_arg1', 'pos_arg2', 'pos_arg3']): 
    print(i, j) 

プリントものは何もありませんのでsetattr sが呼ば取得するつもりはありません。

パラメータを使用するタイミングは?あなたのクラスに__signature__属性を追加します(Stockで行われているように)、それはinspect.signatureようなツールによってピックアップ得ることができる

あなたは(一般的な場合や、呼び出し可能オブジェクト)あなたのクラスのさらなるイントロスペクションをサポートしたいですすなわち:

inspect.signature(Stock) 
Out[16]: <Signature (name, shares, price)> 

inspect.signature(Point) 
Out[17]: <Signature (*args)> 

署名オブジェクトがobject.__signature__を有しており、その場合は呼ばれる署名の表現を構築するかどうかを確認しよう。

さらに、bindに署名してPOSITIONAL_OR_KEYWORD引数をサポートすることができます。

一般に、これはごくわずかな場合にのみ要件として現れます。要するに:あなたはそれが必要かどうかを知るだろう。

また、これはメタプログラミングとどのように関連していますか?

この特定の例は関連していません。あなたは私がリンクするプレゼンテーションで見るように、メタプログラミングでそれを強化することができます。

このような例がいくつかあります。

これは広すぎるリクエストです。しかし、あなたの例は、ダビッド・ビーゼリーのメタプログラミング・プレゼンテーションhere's the presentationに由来します。

私の知識では、Stock関数とPoint関数はStructureクラスを呼び出していますが、make_signatureメソッドはどこにありますか? list_fieldsで定義された属性を持つインスタンス辞書に移入されます

両方StockPoint使用Structure.__init__。クラスはが作成されるとき

__signature__ = make_signature([...])を実行して、それを検出したとき、Pythonはclassの本体を実行します。 make_signatureが呼び出され、Signatureオブジェクトが作成され、__signature__への割り当てが行われます。

+0

make_signatureメソッドのParameter関数の使い方とmake_signatureメソッドのやり方について教えてください。あなたはまた、プログラムの流れ、すなわちどの機能が誰に戻っているのか、その逆のことを教えてくれますか? – BlackBeard

+0

私の返事@NiladriSekharBasuを更新しました。あなたの質問はすでに5つの質問であることに注意してください、あなたはそれを継続的に更新してより多くの情報を要求することはできません。それは*新しい*の質問のためのものです。 –

関連する問題