2017-03-20 3 views
1

私はプロパティとして(ここでは重要ではないラッパーを介して)いくつかの関数をマスクしてオブジェクトに動的に追加しようとしていますが、コード補完とmypyが必要です。Pythonの動的プロパティとmypy

プロパティを動的に(メタクラスまたは単純にコンストラクタを使用して)追加する方法を考えましたが、問題はmypyがそれを拾いません(どちらもIDEはありません)。

回避策の1つは、同じ名前/タイプの属性を定義することですが、このアプローチ(コードが多すぎる、静的な属性セット、繰り返し)が嫌いです。

良い方法がありますか?

class Meta(type): 
    def __new__(cls, clsname, bases, dct): 

     def prop(self) -> int: 
      return 1 

     inst = super(Meta, cls).__new__(cls, clsname, bases, dct) 
     inst.dynprop=property(prop) 
     return inst 

class Foo(metaclass=Meta): 
    dynprop=int #this works, but I don't want it 

class Bar(metaclass=Meta):pass 

def somefunc(s:str): 
    print(s) 

foo=Foo() 
bar=Bar() 
somefunc(foo.dynprop) #this is ok 
somefunc(bar.dynprop) #meta.py:24: error: "Bar" has no attribute "dynprop" 

答えて

1

IDEを修正しましたか? :-) Pythonでは、静的解析ができないコーナーケースが常に存在します。この場合、あなたは道に迷っているあなたを助けるはずのツールを手に入れました。

コードを実行しなくても、IDEまたはMypyがこれらの動的属性を見つける方法はありません。私はIDEがあることを知っています。少なくとも過去には自動完成のモジュールを実際にインポートすることに頼っていましたが、それはまた数多くの副作用を引き起こす可能性があります。

「このチェックしないでください」マークアップスタイルでコメントを追加する点まで、ダイナミックコードを使用するためにはこれらのツールを使用しなくてはならないと思います。オートコンプリートはまったく不可能です。