首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么getopt方法的签名是getopt(args,options[,long_options])而不是getopt(args,options,[ long_options])?

为什么getopt方法的签名是getopt(args,options[,long_options])而不是getopt(args,options,[ long_options])?
EN

Stack Overflow用户
提问于 2013-06-13 02:28:42
回答 3查看 520关注 0票数 0

我正在为一个命令行程序编写一些代码,并且我正在使用getopt()函数。有人能解释一下options / long_options的语法吗?

代码语言:javascript
运行
复制
getopt.getopt(args, options[, long_options])

我的问题是:

为什么列表在参数之间是碎片化的?为什么是options[而不是options?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-06-13 02:31:30

该函数有两个必需的参数(argsoptions)和一个非必需的选项(long_options)。argsoptionslong_options的确切含义都可以在documentation中找到

基本上,如果您希望命令行被解析为:

代码语言:javascript
运行
复制
myprogram --foo=bar

然后,您需要有一个类似于['--foo=']long_options列表,但如果您希望将其解析为:

代码语言:javascript
运行
复制
myprogram -f bar

然后将options设置为'f:'。当然,您可以随意混合和匹配。

不管它有什么价值,我永远不会建议任何人在使用optparse或(甚至更好) argparse时使用getopt。后面的两个模块让使用getopt的感觉就像是用锤子给自己造了一台新电脑……

票数 2
EN

Stack Overflow用户

发布于 2013-06-13 02:31:55

您应该使用argparse而不是getopt,后者现在已被弃用。关于解释,文档确实是可以访问的:

  • http://docs.python.org/dev/library/argparse.html
  • http://docs.python.org/2/howto/argparse.html

关于你的具体问题,我想你已经有了答案:

  • http://docs.python.org/dev/library/argparse.html#option-value-syntax

(请阅读有关thisthat的文章,了解为什么应该使用argparse;甚至getopt文档也声明(原文如此)“不熟悉C getopt()函数的用户,或者希望编写更少代码并获得更好帮助和错误消息的用户,应该考虑改用argparse模块。”)

在最后一次编辑之后:根据惯例,当你在文档中看到被方括号包围的原型的一部分时,这意味着该部分是可选的,而之前的部分是必需的。当你想调用getopt.getopt()时,应该赋值 args和options`。

现在,它不是python,因为这意味着最后一个逗号也是必需的,尽管如果调用getopt.getopt(args, options,),它不是有效的getopt.getopt(args, options, [long_options])表达式。

在上一条评论之后:嗯,这种语法是unix平台上几乎所有工具都使用的约定……我不知道它是否在某个地方定义过,但如果它比POSIX规范本身更早,我也不会感到惊讶!我能找到的唯一的“文档”是下面的维基百科页面,但它缺少参考:

  • http://en.wikipedia.org/wiki/Usage_message

我在caltech找到了一门课程(查找部分“用法语句中的可选参数”),它告诉可选参数使用方括号:

  • http://courses.cms.caltech.edu/cs11/material/general/usage.html

最后,你不是第一个在堆栈溢出上问这个问题的人,至少还有两个关于相同主题的问题:

如果你查看系统上的手册页,你会发现它们都使用这种语法,方括号中的所有参数都是可选的,例如:ls manpagecat manpage,甚至macos的open manpage都使用这种约定!

我希望这次我确实回答了你的问题!

票数 0
EN

Stack Overflow用户

发布于 2013-06-13 02:35:19

参数argsoptions是强制参数,long_options是函数的可选参数,即可以提供也可以不提供。如果您打算支持像--format-f这样的长选项,您可以在命令行实用程序中提供它。

Linux ls实用程序示例,显示以--开头的选项和长选项

代码语言:javascript
运行
复制
LS(1)                                       User Commands                                       LS(1)

NAME
       ls - list directory contents

SYNOPSIS
       ls [OPTION]... [FILE]...

DESCRIPTION
       List  information about the FILEs (the current directory by default).  Sort entries alphabeti‐
       cally if none of -cftuvSUX nor --sort is specified.

       Mandatory arguments to long options are mandatory for short options too.

       -a, --all
              do not ignore entries starting with .

       -A, --almost-all
              do not list implied . and ..

       --author   <--- LONG OPTIONS OF COMMAND LINE
              with -l, print the author of each file
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17072697

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档