目的:呼び出し元から要求された単位(または任意の変更)の関数から値を返します。関数を適切な単位で返すPythonの方法
背景:
私はラズベリーパイ3でPython 2.7を実行している、とロータリーエンコーダが変わった距離を取得する機能distance()
を使用しています。この距離は、関数が呼び出される場所によって異なる単位で必要です。それでは、これはどういう意味になるのでしょうか?
最初の試行:
私の最初の試みは、関数でメートルのユニットを使用し、中に戻るには、右のユニットを選択するために、長いelif
ツリーを持っていることでした
def distance(units='m'):
my_distance = read_encoder()
if units == 'm':
return my_distance * 1.000
elif units == 'km':
return my_distance/1000.
elif units == 'cm':
return my_distance * 10.00
elif units == 'yd':
return my_distance * 1.094
else:
return -1
。
このアプローチの良い点は、利用できないユニットを認識する方法があることです。
第二の試み:
私の第二の試みは様々なmultipliers
を格納するための辞書を作成することでした。
def distance(units='m'):
multiplier = {
'm': 1.000,
'km': 0.001,
'cm': 10.00
'yd': 1.094
}
try:
return read_encoder() * mulitplier[units]
except KeyError:
return -1
ここでは、認識できない単位はKeyError
でキャッチされます。
関連性:
私はPintのような既存のライブラリを知っているが、この計画問題への解決策を探しています。 Pythonで関数があり、再利用可能な方法で出力をわずかに変更する必要があるとき。私はspeed()
のような 'm/s'を基本単位とし、同様のunits
引数を必要とする他の関数を持っています。私の経験から、よく構造化されたプログラムはすべてのreturn文の前にelif
の段落の段落を伴わない。この場合、ユニットをどのように計算するかを変更したいのであれば、コードを使って慎重にgrep
する必要があり、すべてのインスタンスでユニットがどのように計算されるかを変更する必要があります。適切な解決策は、計算を一度変更するだけで済みます。
これは広すぎる可能性がありますが、それは私が走り続けているパターンです。
、私はそれを使用するために多くのことを意図している場合、私の内部のC#devのは、拡張メソッドを作ると言うでしょうが個人的に私が '、第二の試みとなるだろう.convertTo( 'ms') 'などです。その後、 'encoderReading.convertTo( 'm')'を実行すると、構文が本当にうまく見えると思います。 –
あなたはあなたのすべての値が10の累乗であることを知っています。また、整数は文字列よりも速いことも知っていますので、mapとlambdaを使って乗数の静的な値を動的に設定した値にマッピングすることで、 – dmitryro
残念ながら、私の実際の実装には非SI単位(つまりヤード、マイル)もあります。誰もが選択単位でデータを表示することを望んでいます。私はそれを反映するために私の質問を更新します。 –