2016-07-04 45 views
0

我注意到,Python经常使用字符串,你可以使用某种定义的符号,就像一个常量。例如,为了从​​套用的代码的示例:为什么字符串比定义的符号(常量)更受青睐?

import argparse 

parser = argparse.ArgumentParser(description='Process some integers.') 
parser.add_argument('--sum', dest='accumulate', action='store_const', 
        const=sum, default=max, 
        help='sum the integers (default: find the max)') 

而不需要使用字符串'store_const'的,为什么没有开发者定义的恒定状符号,例如ArgumentParser.STORE_CONST

我更喜欢常量,因为代码编辑器可以很容易地在模块中看到它们,并将它们用作代码完成的建议。此外,字符串中的拼写错误可能不会导致错误,但定义的符号中可能会出现拼写错误。我已经在Python中看到了几种用这种方式使用的字符串示例,但是在其他语言(如Java或PHP)中并不常见。

+2

你可能需要问dev Elopers或Guido本人。除此之外,你只是想获得意见。 –

+1

虽然类似enum的构造会在Java或C++等语言中出现编译错误(如果拼写某些常量名称错误,甚至在Python中提供现成的常量将仅在运行时提供错误)该代码路径。 IOW:由于我们将运行时检查的字符串与运行时查找的运行时定义的符号进行比较,因此没有太大的区别。 –

+2

(另外,请注意,即使在Python标准库中,这似乎也是一个偏好问题 - 如果查找“re”模块,则所有正则表达式标志都是“re”模块中的顶级常量) –

回答

1

许多库使用“常量” ......包括argparse

您可以非常容易地传递argparse._StoreConstAction

它还提供了以下命名常量

SUPPRESS = '==SUPPRESS==' 

OPTIONAL = '?' 
ZERO_OR_MORE = '*' 
ONE_OR_MORE = '+' 
PARSER = 'A...' 
REMAINDER = '...' 
_UNRECOGNIZED_ARGS_ATTR = '_unrecognized_args' 

另一种选择是编写自己的常量类,其中包含所有的魔法数字和/或打扰你的字符串

+1

确实列出了各种“Action”子类:https://hg.python.org/cpython/file /3.5/Lib/argparse.py#l1233。请注意,它们明确从公共界面中排除。 – jonrsharpe

+0

所以你不能''从argparse导入_StoreConstAction' ...但它仍然给他自动完成'import argparse; argparse._St ...' –

相关问题