0

を使用することはpythonicとは見なされないことがわかりisinstance()、人々はたとえばを使用することを提案しますhasattr()

を使用する関数の適切な使用法を文書化するのが最善の方法だと思いますhasattr()

例:さまざまなWebサイト(Yahoo Finance、Google Financeなど)から株式データを取得しましたが、クラスがGoogleFinanceDataありYahooFinanceData、どちらにもメソッドがありget_stock(date)ます。2つの株式の価値を比較する関数もあります。

def compare_stocks(stock1,stock2,date):
    if hasattr(stock1,'get_stock') and hasattr(stock2,'get_stock'):
        if stock1.get_stock(date) < stock2.get_stock(date):
            print "stock1 < stock2"
        else:
            print "stock1 > stock2"

この関数は次のように使用されます。

compare_stocks(GoogleFinanceData('Microsoft'),YahooFinanceData('Apple'),'2012-03-14')

このようには使用されません:

compare_stocks('Tree',123,'bla')

stock1問題は、どのクラスに使用できるかを人々に知らせるにはどうすればよいstock2ですか。私はのようなdocstringを書くことになっていて"stock1 and stock2 ought to have a method get_stock"、人々はソースを自分で調べなければなりませんか?または、すべての正しいクラスを1つのモジュールに入れて、そのファイルをdocstringで参照しますか?

4

3 に答える 3

3

インスタンスを使用して関数を呼び出すだけの場合は、メソッド*FinanceDataのテストに煩わされることはありません。get_stock他のものを渡すのはエラーであり、誰かが文字列を渡すと関数は壊れます。

言い換えれば、get_stock()メソッドを期待するものとして関数を文書化するだけで、テストはまったく行いません。ダックタイピングは、特定の1つのタイプでのみ機能するコードではなく、明確に異なるタイプの入力を受け入れる必要があるコード用です。

于 2012-09-12T10:10:58.270 に答える
1

あなたが提案することをしてください、渡された引数がget_stock関数を持つべきであるというdocstringを入れてください、それはあなたの関数が必要とするものです、コードが誰かに合うとき派生クラスまたは他のクラスでうまく使われるかもしれないのでクラスをリストすることは悪いです。

于 2012-09-12T10:00:08.653 に答える
1

の使用について何が非Pythonであるかわかりませんisinstance()。基本クラスを作成し、基本クラスのドキュメントを参照します。

def compare_stocks(stock1, stock2, date):
    """ Compares stock data of two FinanceData objects at a certain time. """
    if isinstance(stock1, FinanceData) and isinstance(stock2, FinanceData):
        return 'comparison'

class FinanceData(object):
    def get_stock(self, date):
        """ Returns stock data in format XX, expects parameter date in format YY """
        raise NotImplementedError

class GoogleFinanceData(FinanceData):
    def get_stock(self, date):
        """ Implements FinanceData.get_stock() """
        return 'important data'

ご覧のとおり、ここではダックタイピングを使用していませんが、ドキュメントに関してこの質問をしたので、これが読みやすさのためのよりクリーンなアプローチだと思います。compare_stocks別の開発者が関数またはメソッドを見るときはいつでもget_stock、機能、データ構造、または実装の詳細に関する詳細情報をどこで探す必要があるかを正確に知っています。

于 2012-09-12T10:11:05.947 に答える