2011-09-12 1 views
3

cmdモジュールを使用してCLIタイプのインターフェイスを提供する単純なPythonアプリケーションを作成しています。 CLIが提供するコマンドには、さまざまなパラメータリストがあります。各コマンドハンドラは、引数を含む行の部分を含む文字列引数を受け取ります。私はshlex.splitを使ってそれらをタプルにトークン化する予定です。その後、私は、文字列のタプルを取得し、それらが整形式であることを検証し、きれいに指定された数値型のタプルに変換する最もPythonの方法を探しています。Pythonタプルの文字列を動的に指定された型に変換するにはどうすればよいですか?

例:私は3つの引数を取る関数foo有する:第一に、ディスク上のファイルへのパスを、第二の浮動小数点値であり、第3の整数である、のように:

foo /home/jason/file.bin 123.456 123456 

これは、Cのsscanf()と書式文字列"%s %f %d"を使用するのと同じようなものです(このアプローチに固有の空白処理の問題を理解しています;これは単なるイラストです)。

私はint()float()などを呼び出し、例外を適切にキャッチするハンドラ関数ごとに定型コードを書くことでこれを達成できることを知っています。これを行うためのよりクリーンな方法があるはずです。

答えて

2

引数を解析し、無効な引数の例外を発生させる関数としてプロダクションルールを提供することをお勧めします。そう。あなたの例は次のようになるかもしれません:

FOO_SYNTAX = (file, float, int) 
def foo_cmd(infile, infloat, inint): 
    pass 

def parse_args(rule, args): 
    if len(rule) != len(args): 
     raise ValueError, "Wrong number of arguments" 
    return [rule_item(arg) for rule_item, arg in zip(rule, args)] 

COMMANDS = {'foo': (FOO_SYNTAX, foo_cmd)} 

def dispatch(line): 
    cmd, rest = line.split(None, 1) 
    args = rest.split() 
    syntax, cmd_func = COMMANDS[cmd] 
    cmd_func(*parse_args(syntax, args)) 
+0

これはまさに私が探していたアプローチのタイプです。私はそれが素晴らしい解決策だと思う。 –

+0

1つのコメント:私はあなたの意図を誤解している可能性がありますが、 'parse_args'の最後の行で' RULE'が小文字であると仮定し、 'rule'リストを反復して各変換関数を対応する要素'args'リスト内の-wという文字列です。 xrange(len(rule))のiに対して、 'map()'は最初の引数のためにただ一つの関数しか持たないので、代わりに、リストの理解を使っていました: 'return [rule [i](args [i] )] '' –

2

Python 2.6または2.7のどちらを使用しているかによって、組み込みのoptparseまたはargparseをそれぞれ使用できます。

http://docs.python.org/library/argparse.html

彼らは少しヘビー級することができるが、それらはint型への変換をやる、浮かぶか、解析の一部として必要なものは何でもタイプ、それが自動的に使用方法のメッセージや他の素敵な引数解析を構築することができますもの。

+0

あなたが指摘したようにビットが重いですが、そのアイデアはうまくいくように見えます。ポインタありがとう。私はTokenMacGuyのソリューションを少しスリムで受け入れています。 –

関連する問題