2017-09-27 9 views
0

私は自分の小さなコマンドラインインターフェイスをPythonで作成しています。コマンドの1つは「export」です。これは基本的に変数を作成します。例:Python辞書から変数を作成する

> export NUM=15 

ここでNUMは '15'になります。 CLIで他のコマンドと一緒に「NUM」を使用すると、数字「15」と同じになります。出力は「F」でなければなりません

> hex NUM 

が、プログラムはNUM = 15を認識しません:私は進に小数を変換し、別のコマンド「進」を持っています。関数の外で変数辞書を宣言しました。 CLI.py全体を投稿するつもりはありませんが、ここにエクスポート機能があります。基本的には、変数辞書にkey=valueを割り当てる必要があります。

def CommandExport(args): 
    if (len(args) == 0): 
    print(variables) 
    else: 
    for line in args: 
     args = line.split('=') 
     ENV = args[0] 
     value = args[1] 
     if (int(args[1]) == True): 
      value = int(value) 
     else: 
      value = str(value) 
     variables[ENV] = (value) 
     for ENV, value in variables.items(): 
      vars()[ENV] = (value) 
      return(ENV) 
      return(value) 
      return(variables) 

動作するはずですが、そうではありません。何か案は?

+3

最初の呼び出しの 'return(ENV)'の後に関数が返るので、 'return(value)'と 'return(variables)'は決して実行されません。代わりに、 'ENV、value、variablesを返す'の場合、かっこは必要ありません。 – DavidG

+0

@DavidGでも正しいものではありません。これらのreturn文はforループ内にあるため、最初の繰り返しの後に戻ります。私はOPが実際に戻ってくる必要はないと思う。 –

答えて

0

そこは、Pythonの原則

  • variablesのいくつかの誤解をしなければならないその多くがこのコードの問題の多くは、以下のとおりです。 variablesは何ですか? 引数= line.split( '=')変数を上書きするとき

は常に警戒する:これは、いくつかのモジュールの名前空間引数の行のための

  • args

    における変数です。一部の言語では、コードの各ブロックのスコープを持っていますが、Pythonでここ

    if (int(args[1]) == True): 
        value = int(value) 
    else: 
        value = str(value) 
    
    • int

      あなたは整数にargsリストの2番目のアイテムを変換するのpythonを尋ねると、それを真と比較してください。 args[1]integer 1float 1.0boolean Trueまたはstring '1'あるときに、このテストは唯一Trueが整数値を持っているので、このような1.何かがより適しているだろう、渡します

      try: 
          value = int(value) 
      except ValueError: 
          pass 
      
      これは、それが失敗した場合、int型に変換しようとする

      、値は文字列に残りますargs[1]

      まったく私はあなたがpythonの基本をリフレッシュする必要があると思います。この特定の問題に関するサポートが必要な場合は、完全なCLI.pyを、どのように呼び出すべきか、どのようにすべきかの例とともに投稿することをお勧めします。

      あなたは、コマンドとその引数を解析したい場合は、私はこの

      def convert_int(value): 
          try: 
           return int(value) 
          except ValueError: 
           return value 
      
      def parse_arguments(arguments): 
          for arg in arguments: 
           key, value = arg.split('=') 
           yield key, convert_int(value) 
      
      def parse_command(input_string): 
          command, *argument_list = input_string.split(' ') 
          arguments =dict(parse_arguments(argument_list)) 
          return command, arguments 
      
      parse_command('my_command arg0=a0 arg1=val1 arg2=2') 
      
      ('my_command', {'arg0': 'a0', 'arg1': 'val1', 'arg2': 2}) 
      

      この方法は、その後に使用することができるような何かをするだろうあなたの環境と変数を維持するために使用するClass

    関連する問題