【问题标题】:How to get advanced usage of getop() in php like python argparse如何在 php 中获得 getop() 的高级用法,如 python argparse
【发布时间】:2013-04-18 01:34:41
【问题描述】:

我通常使用argparse module in Python 来检测选项/参数、打印使用等。我试图在 PHP 中从本机代码或使用一些轻量级库/框架获得相同的结果,而无需编写大量的换行。

根据我的研究,我刚刚发现getop()'s native PHP implementation,它与getop()'s C implementation 非常相似,并且作为某些用途(独占选项、前缀选项、参数冲突处理程序、选项、元变量等)的框架非常有限。我想找到一种简单的方法来在 PHP 中获得相同的结果,而无需使用原始 argvreinventing the wheel 或实现“yet another improved library for getop()”来解析参数。

这是argparse 示例在 Python 中的样子:

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 vs php,我可能是相同的ruby vs php、java vs php 或其他。它只是关于如何使用本机库以另一种不同的语言很好地和高效地移植代码。

【问题讨论】:

    标签: php python argparse getopt


    【解决方案1】:

    我刚刚发现了一个几乎接近于 python argparse 库的东西。 php library Getopt.PHP partialy 在 argparse 中模拟具有多个功能和相同行为的解析器。

    例如 add_options() ~= addOptions() 方法,带有位置参数或必需参数、自动用法生成、检索值、错误处理等。

    目前,它仍然需要一些更高级的功能,如冲突处理程序、选择或元变量、仅解析已知值、参数排除、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();
    

    【讨论】:

      猜你喜欢
      • 2014-08-14
      • 2013-02-26
      • 1970-01-01
      • 2013-06-02
      • 2019-05-18
      • 1970-01-01
      • 2013-06-15
      • 2022-01-04
      • 1970-01-01
      相关资源
      最近更新 更多