1

optparse からオプションの引数を渡す方法を見つけようとしています。私が抱えている問題は、optparseオプションが指定されていない場合、デフォルトでNoneタイプになりますが、Noneタイプを関数に渡すと、デフォルトを使用する代わりに怒鳴ります(これは理解可能で有効です)。

conn = psycopg2.connect(database=options.db, hostname=options.hostname, port=options.port)

問題は、オプションの引数に関数のデフォルトを使用し、膨大な数の if ステートメントを使用せずに入力がある場合にユーザー入力を渡すにはどうすればよいかということです。

4

2 に答える 2

2

remove_none_values値のない引数のディクショナリをフィルター処理する関数を定義します。

def remove_none_values(d):
    return dict((k,v) for (k,v) in d.iteritems() if not v is None)

kwargs = {
  'database': options.db,
  'hostname': options.hostname,
  ...
}
conn = psycopg2.connect(**remove_none_values(kwargs))

または、データを元の関数に渡す前に値を削除しない関数ラッパーを定義します。

def ignore_none_valued_kwargs(f):
    @functools.wraps(f)
    def wrapper(*args, **kwargs):
        newkwargs = dict((k,v) for (k,v) in d.iteritems() if not v is None)
        return f(*args, **kwargs)
    return wrapper

my_connect = ignore_none_valued_kwargs(psycopg2)
conn = my_connect(database=options.db, hostname=options.hostname, port=options.port)
于 2012-07-26T02:11:15.533 に答える
0

私のパッケージのopoモジュール( https://bitbucket.org/therp/thebops ) には関数が含まれています。これは、オプションが値なしで使用される場合に使用する値を指定する追加のキーワード引数を使用します。オプション文字列の 1 つがコマンドラインで見つかった場合、この値が引数リストに挿入されます。thebopspip install thebopsadd_optval_optionempty

これはまだハックですが、少なくとも使いやすい機能になっています...

以下の状況でうまく機能します。

  • オプションの作成時に、引数ベクトルが既に存在します。これは通常真です。
  • オプションの値を持つスポーツ引数を見つけたすべてのプログラムでは、指定された--option=value値をor-ovalueではなく--option valueorとして添付する必要があり-o valueます。

たぶん、私も議論thebops.optparseをサポートするために微調整します。しかし、回帰を防ぐために最初にテストスイート、できれば元の/テストemptyを用意したいと思います。Optikoptparse

これはコードです:

from sys import argv
def add_optval_option(pog, *args, **kwargs):
    """
    Add an option which can be specified without a value;
    in this case, the value (if given) must be contained
    in the same argument as seen by the shell,
    i.e.:

    --option=VALUE, --option will work;
    --option VALUE will *not* work

    Arguments:
    pog -- parser or group
    empty -- the value to use when used without a value

    Note:
      If you specify a short option string as well, the syntax given by the
      help will be wrong; -oVALUE will be supported, -o VALUE will not!
      Thus it might be wise to create a separate option for the short
      option strings (in a "hidden" group which isn't added to the parser after
      being populated) and just mention it in the help string.
    """
    if 'empty' in kwargs:
        empty_val = kwargs.pop('empty')
        # in this case it's a good idea to have a <default> value; this can be
        # given by another option with the same <dest>, though
        for i in range(1, len(argv)):
            a = argv[i]
            if a == '--':
                break
            if a in args:
                argv.insert(i+1, empty_val)
                break
    pog.add_option(*args, **kwargs)
于 2014-04-02T08:40:49.337 に答える