2

私は通常、Python で argparse モジュールを使用して、オプション/パラメーター、印刷の使用法などを検出します。多くの折り返し行を書かずに、ネイティブ コードから、またはいくつかの軽量ライブラリ/フレームワークを使用して、PHP で同じ結果を得ようとしています。

私の調査から、getop() のネイティブ PHP 実装を見つけました。これはgetop() の C 実装に非常に似ており、特定の用途 (排他的オプション、プレフィックス オプション、パラメーター競合ハンドラー、選択肢) のフレームワークとして非常に制限されています。 、メタバーなど)。rawargvを使用せずに PHP で同じ結果を得るための簡単な方法を見つけたいと思います

argparsePython での例は次のようになります。

from argparse import ArgumentParser, ONE_OR_MORE, ArgumentDefaultsHelpFormatter

__version__ = '3.14'
description = 'some description'

parser = ArgumentParser(
                         prog                  = 'someprogram',
                         description           = description,
                         epilog                = None,
                         parents               = [],
                         formatter_class       = ArgumentDefaultsHelpFormatter,
                         prefix_chars          = '-',
                         fromfile_prefix_chars = None,
                         argument_default      = None,
                         conflict_handler      = 'error',
                         add_help              = True,
                        )

parser.add_argument('-o', '--output',
                    action         = 'store',
                    metavar        = '/path/to/output',
                    dest           = 'output',
                    choices       = None,
                    help           = 'Set the output directory')

parser.add_argument('-q', '--quiet',
                    action         = 'store_true',
                    dest           = 'quiet', 
                    default        = False,
                    help           = 'Don\'t print status messages to stdout')

parser.add_argument(option_strings = ['FILES'], 
                    metavar        = 'FILES', 
                    nargs          = ONE_OR_MORE,
                    type=str,
                    dest           = 'FILES',
                    help           = 'One or more files to process')

parser.add_argument('-v', '--version', 
                    action  ='version',
                    version ='%(prog)s {version}'.format(version = __version__),
                    help    = 'Shows the program version')

args = parser.parse_args()

PHP では同じ動作を変換できますが、Python のような引数パーサーを完全にエミュレートするには多くの行が必要です。

PS: この質問を python 対 php と解釈しないでください。私は同じ ruby​​ 対 php、java 対 php などになる可能性があります。それは、ネイティブ ライブラリを使用して別の異なる言語でコードを適切かつ効率的に移植する方法についてです。

4

1 に答える 1

2

Python argparse ライブラリにほぼ近似していることがわかりました。PHP ライブラリ Getopt.PHPは部分的にパーサーをエミュレートし、複数の機能と argparse での同じ動作を備えています。

たとえば、add_options()~=addOptions()位置引数または必須引数を使用したメソッド、自動使用法生成、取得値、エラー処理などです。

現時点では、コンフリクト ハンドラー、choices または metavar、既知の値のみの解析、パラメーターの除外、nargs などのより高度な機能については、まだ作業が必要です。しかし、簡単に拡張したり、適切な実装ベースの開始として使用したりできます。

私の質問の Python サンプル コードは、次のようにほぼ翻訳できます (機能が欠落しています)。

$getopt = new Getopt;
$getopt->addOptions(array(
    array('o', 'output', Getopt::OPTIONAL_ARGUMENT, 'Set the output directory'),
    array('q', 'quiet', Getopt::OPTIONAL_ARGUMENT, 'Don\'t print status messages to stdout'),
    array('v', 'version', Getopt::OPTIONAL_ARGUMENT, 'Shows the program version'),
    array('FILES', NULL, Getopt::REQUIRED_ARGUMENT),
));

$getopt->parse();
于 2013-04-24T16:35:47.943 に答える