8

これが重複していないことを本当に願っています。質問を検索しようとしましたが、見つかりませんでした。

だから私はフィートをメートルに変換するかなり単純な関数を持っています:

def feetToMeters(val):
    return numpy.array(val) * 0.3048

これはうまく機能し、int、float、array、およびlistを受け入れます。ただし、(numpy配列ではなく)リストを作成する場合は、リストを返したいのですが。だから私はこれを書いた:

def feetToMeters(val):
    try:
        return val * 0.3084
    except TypeError:
        return [0.3084 * v for v in val]

(または、ここでreturn list(numpy.array(val) * 0.3084)使用したい場合は最後の行に使用できますがnumpy、それが本当に重要かどうかはわかりません。)

typeこれは、関数の使用を回避できるように、ここにダックタイピングを組み込むための最良の方法ですか?もともと試しAttributeErrorましたが、うまくいきませんでした。それでも、うまくいくように見えても、私はうんざりしTypeErrorています。

if type(val) is list代わりに使用するのは犠牲になりますか?

4

4 に答える 4

6

if type(val) is list代わりに使用するのは犠牲になりますか?

はい、リストのサブクラスでは機能しないためです。このように行きたいのなら、少なくともそうしてくださいisinstance(val, list)。リストを特別に扱い、他のすべて(スカラーとタプルを含む)をNumPy配列に変換するソリューションは次のとおりです。

def feetToMeters(feet):
    meters = np.asarray(feet) * 0.3048
    return list(meters) if isinstance(feet, list) else meters

ご了承ください:

  • のサブクラスのインスタンスを渡すlistと、プレーンlistが返されます。
  • リストのリストを渡すと、NumPy配列のリストが返されます。

これを拡張して、より多くの型を特別に処理することもできますが、一般に、処理する型ごとに、その型の作成方法を知る必要があるため、より多くのコードを記述する必要があります。したがって、この種の型変換は通常、クライアントコードに任されています。

于 2012-07-10T21:15:14.210 に答える
3

あなたはすでにnumpyを使用しているので、ここでは次のような例外を使用しないようにします

def feetToMeters(val):
    if numpy.isscalar(val):
        return val * 0.3084
    else:
        return numpy.array(val) * 0.3048
于 2012-07-10T21:15:00.500 に答える
1

TypeErrorをキャッチすることは、リスト以外の多くの原因によって引き起こされる可能性があるため、危険です。私は通常、この目的のためにisinstance(val、list)を使用します。

于 2012-07-10T21:13:42.927 に答える
0

秘訣は、スカラーとシーケンスをサポートしようとしていることです-おそらくこのようなものがあなたのために働くでしょう:

def feetToMeters(val):
    try:
        return type(val)(val * 0.3048)
    except TypeError:
        return type(val)(v*0.3048 for v in val)
于 2012-07-10T21:15:38.167 に答える