4

次のスクリプトが渡された引数を出力しない理由を誰でも見つけることができますか?

import sys, getopt

def usage():
    print 'Unknown arguments'

def main(argv):
    try:
        opts, args = getopt.getopt(argv,'fdmse:d',['files=','data-source=','mode=','start','end'])

    except getopt.GetoptError:
        usage()
        sys.exit(999)

    for opt, arg in opts:
        # print opt,arg 
        if opt in('-f','--files'):
            print 'files: ', arg  #

if __name__ == "__main__":
    main(sys.argv[1:])

コマンドラインでスクリプトを実行して引数を渡すと、-f=dummy.csv代わりusage()に呼び出されるようです-なぜですか?

ところで、プログラム フローのロジックが少し奇妙だと思います (ここからコピーしました)。通常、ロジックは try ブランチに実装され、その後に例外ハンドラが実装されると考えていました。

これは (上記のコードに貼り付けられているように) try/catch ブロックを記述する「Pythonic」な方法ですか?

4

3 に答える 3

2

答えはわかりましたか?

Python 例外をデバッグする 1 つの方法は、try ブロックからコードを移動 (またはデバッグのために一時的にコピー) することです。完全なトレースが得られます。

そしてもちろん、別の方法はテストケースを減らすことです。ここでは、問題を 3 行に減らし、@s.lott (getopts 呼び出しで 'f:' を使用) によって示唆された解決策を試し、いくつかの異なるテスト データでの呼び出しがどのように動作するかを最後に示します。

$ cat x1.py
import sys, getopt
opts, args = getopt.getopt(sys.argv[1:],'fdmse:d',['files=','data-source=','mode=','start','end'])
print "opts=", opts, "args=", args

$ python x1.py -f=dummy.csv argblah
Traceback (most recent call last):
  File "x1.py", line 2, in <module>
    opts, args = getopt.getopt(sys.argv[1:],'fdmse:d',['files=','data-source=','mode=','start','end'])
  File "/usr/lib/python2.6/getopt.py", line 91, in getopt
    opts, args = do_shorts(opts, args[0][1:], shortopts, args[1:])
  File "/usr/lib/python2.6/getopt.py", line 191, in do_shorts
    if short_has_arg(opt, shortopts):
  File "/usr/lib/python2.6/getopt.py", line 207, in short_has_arg
    raise GetoptError('option -%s not recognized' % opt, opt)
getopt.GetoptError: option -= not recognized

$ sed 's/fdm/f:dm/' <x1.py >x2.py

$ diff x1.py x2.py
2c2
< opts, args = getopt.getopt(sys.argv[1:],'fdmse:d',['files=','data-source=','mode=','start','end'])
---
> opts, args = getopt.getopt(sys.argv[1:],'f:dmse:d',['files=','data-source=','mode=','start','end'])

$ python x2.py -f=dummy.csv argblah
opts= [('-f', '=dummy.csv')] args= ['argblah']

$ python x1.py -f dummy.csv argblah
opts= [('-f', '')] args= ['dummy.csv', 'argblah']
于 2010-11-29T23:42:46.997 に答える
1

通常であれば、try ブランチにロジックが実装されると思っていたでしょう。

"通常は"?普通 とはどういう意味ですか?

プログラムは何をすることになっていますか?どのような例外が理にかなっていますか? プログラムは例外に応答して何をしますか。

「普通」はありません。通常の割り当てステートメントまたは通常の関数定義がある以上。

あなたのプログラムは、必要な最終状態を達成するために意味のあることを行います。「普通」はありません。

于 2010-10-14T15:33:15.153 に答える
0

getopt の代わりに argparse をインポートして使用します。はるかに使いやすく、コマンドラインから実行するために必要なほとんどすべてが組み込まれています。

例、

    parser = argparse.ArgumentParser(
        description='Description of what the module does when run.')
    parser.add_argument("-o", "--output", help='Path of log file.')
    args = parser.parse_args()

それと同じくらい簡単です。もちろん、これを機能させるには、ファイルの先頭に argparse をインポートする必要があります。

于 2015-02-16T04:34:29.763 に答える