コードをもう少し「Pythonic」にしてみましょう。あなたが書いた:
calcInputs = {}
def fetch(entries):
for entry in entries:
field = entry[0]
text = entry[1].get() # User input for each textbox
print('%s: %s' % (field, text)) # Print to stdout with name
if len(text) == 0:
pass # Don't update dictionary with nulls
else:
calcInputs.update({field:text}) # name : value updated to dictionary
をこれはcalcInputs
は、永続的になるだろうという問題がある - つまり、それは次のサイクル(複数のサイクルがあると仮定した場合)まで、周りのままになりますので、に1時間から周りのデータを保持するかもしれません次の関数内でその空の辞書を初期化してみましょう。常に清潔なスレートで始めます。 (注意:入力ボックスは、サイクルごとにその値を保ち場合、それは私と一緒に大丈夫だ - ユーザーはそれを見て、彼女が望んでいる場合は、それをきれいにすることができます。)
def fetch(entries):
inputs = {}
この次のビットは大丈夫そうです、私はものの、 PythonのTkinterの下に精通していない:
for entry in entries:
field = entry[0]
text = entry[1].get()
これは明らかにデバッグコードです - あなたは満足しているまでそれを続けます。
print('%s: %s' % (field, text)) # Print to stdout with name
次の部分は「間違っています。あなたがJavaから来ているように見えますが、これは素晴らしい言葉です。しかし、私たちは"truthiness"と構文的な砂糖のために、少し洗っています。 Pythonでは、彼らが空でない場合、文字列は「真」であり、辞書はdict[key]
表記を使用してインデックスを作成することができます。
if text:
inputs[field] = text
をそして、それはこれだけです。しかし、我々はグローバル変数を使用していないことから、のは、先に行くと、結果を返してみましょう:
return inputs
は今、あなたはフェッチ呼び出し、その結果を使用することができます。または、あなたが好きな場合は、結果をグローバルに再割り当てすることができます:
入力が完了したら、それを処理してください。入力した入力が実際に分からないという点で問題があります。
KW = 'kW'
PF = 'PF'
THETA = 'Theta'
:
calcInputs = fetch(entries) # Or however you choose to init calcInputs
if KW in calcInputs and PF in calcInputs:
triangle_from_KWPF(calcInputs)
elif KW in calcInputs and THETA in calcInputs:
triangle_from_KWTHETA(calcInputs)
elif ...
:
else:
report_error("You didn't provide enough inputs! I need at least 2!")
Pythonのin
オペレータ:簡単な方法は、我々はいくつかの定数を定義することによって、より簡単に作ることができる2つの値を、(引用符のすべての時間を入力する必要がないように)関与のif/then文だけのシリーズです辞書やセットのキーやメンバシップのテスト、文字列の部分文字列検索、リニアスキャンのリストとして機能します。
このアプローチは、@Aldenが記述するバイナリスタイルのシーケンスであり、すべてがスペルアウトされています。
もう一つの方法は、あなたの指定したパラメータを符号化ハッシュ可能オブジェクトを作成し、それらをディスパッチするために辞書を使用することです:
given_keys = []
for key in sorted(fields):
if key in calcInputs:
given_keys.append(key)
if len(given_keys) == 2:
break
else: # Fell through
report_error("You didn't provide enough inputs! I need at least 2!")
# given_keys has 2 field-names in it. Concatenate them.
calc_key = '_'.join(given_keys)
# calc_key looks like "KW_Theta"
dispatch = { # dictionary: string -> function
'KW_Theta' : triangle_from_KW_Theta,
'KW_PF' : triangle_from_KW_PF,
# etc....
}
calc_function = dispatch[calc_key]
calc_function(calcInputs)
注:for...else
が有効なPythonの形です。 forループがiterableを使い果たすと、else
句が実行されます。だから、途中でbreakステートメントを持つブロックのために作られているのです。
calcInputがクリアされないように修正しました。ありがとうございます。 私は実際にはJava(Javaの大学でのみ使用されている)よりもPythonに精通していますが、明らかにそれほど優れていません。 "if text:"部分は基本的に好きですがtrue:と思いますか?本質的な財産に頼っている? ハッシュ/連結方法は私にとっては最もコンパクトで読みやすいと思われるので、私はそれを実装しようと考えています。ありがとうございました! –
ボーナスポイントの場合、関数名を正しく選ぶと、 'globals()'によって返された辞書をディスパッチ辞書にすることができます。実際の関数名を計算し、現在のモジュールで調べて呼び出します。 –