2017-05-15 6 views
0

ユーザー入力による辞書から関数を実行する次のコードを記述しました。シリアル接続が含まれています。そのため、近いシリアルポートコマンドが後で関与するため、これに気をつけないでください。ユーザー入力による辞書からの関数の呼び出し - ValueErrorが私よりも頻繁に呼び出される

from commands import test1, test2, test3, finangle, Testsequence 
    dict = { 
     'test1':test1, 
     'test2':test2, 
     'test3':test3, 
     'finangle':finangle, 
     'Testsequence':Testsequence 
    } 

この辞書は、ユーザーが入力内容を制限するために使用します。

def select_function(): 
    while True: 
     try: 
      cmd = input("Now please type in function name. \nType in 'end' to end the program. ") 
      if cmd == 'end': 
       ser.close() # close serial connection 
       print("Connection to serial port " + ser.portstr + " closed.") 
       sys.exit() 
      if cmd in dict: 
       return dict[cmd]() 
     except: 
      raise ValueError('Invalid input!') 

select_function() 

は、私の知る限りでは、この全体のことは、私は「リターン」を使用すると、このコマンドは、関数の外で呼び出すことはできませんので機能でなければなりません。

私は5つの関数のうちの1つを呼び出すか、シリアル接続を閉じて残りのスクリプト(sys.exit)を終了する「終了」のどちらかを選択するようにしました。ユーザー入力が 'end'でないか、辞書内にある場合、ValueErrorと 'Invalid input!'育てられる! しかし、 'end'と 'Testsequence'または 'finangle'と入力するとValueErrorが発生します。 'test1'、 'test2'、 'test3'は正常に動作しています。私は 'Testsequence'と 'finangleが正しく定義されていることを100%確信しており、数回チェックしました。また、「終わり」を正しく書くことができると確信しています。誰か私が間違っていることを見ることができますか?

また、入力を無効にした後で2番目の選択肢を与えたいと思います。そして、彼はこれについて知っておく必要があります。しかし、私がそれを書くと、

except: 
    raise ValueError('Invalid input! Please try again!') 
    select_function() 

が得られますが、エラーメッセージは表示されません!これをどうすれば解決できますか?

EDIT:解決

問題。 Pythonの基本を誤解しただけなので、気分が悪いです。ありがとうダニエルローズマン。ここでは結果のコードは次のとおりです。

ほぼ確実
def select_function(): # has to be a function because of 'return' 
    while True: 
     cmd = input("Now please type in function name. \nType in 'end' to end the program. ") 
     if cmd == 'end': 
       print("Connection to serial port closed.") 
       sys.exit() 
     if cmd in dict: 
       return dict[cmd]() 
     else: 
      print('Invalid input! Please try again!') 
      select_function() 

select_function() 
+0

変数 'dict'の命名は悪い考えです。システム定義クラス' dict'を陰にします。 – 9000

答えて

0

、あなたのあなたが期待していない他の問題を引くことを除いて - serが定義されていないので、おそらく、NameErrorを。

しかし、ポイントがありませんあなたがしていることをやっています。 dict[cmd]はすでにValueErrorを発生させます。その例外を発生させるためだけに物事を捕まえることは無意味です。 try/exceptを完全に削除します。

+0

あなたの答えをありがとう。私がtry/exceptを使う理由は、関数が正しく書かれていないと、ユーザに別の機会を与えたいからです。私は編集でこの質問を追加しましたが、あなたは少し速すぎました、ごめんなさい! ;) 'ser'は、スクリプトの開始時に、シリアル接続を開くときに定義されます。 'ser'を定義せずにこれまでスクリプトを実行する方法はありません – Tobitobitobi

+0

しかしtry/exceptとは関係ありません。もしあなたがそれを取り除いてしまったら、あなたは 'while True'を持っているので*これはすでに起こっています*。一方、本当の問題が何であれ、それ以外は隠れています。 –

+0

あなたは正しいです。ありがとうございました!それは速く解決されました。 EDITに追加しました – Tobitobitobi

関連する問題