Python函数输入的字符串选项
我正在写一个Python函数(2.7),其中一个输入参数是一个字符串。这个字符串的值应该是几个特定值中的一个。
比如说,这个参数“sort”可以是列表中的任何一个值,像是['first author' 'last author' 'title'](实际上这个列表还要长一些)。
我想知道有没有什么好的方法来帮助用户输入这个参数(通过按Tab键自动补全)。我的最终目标是改善用户界面,让用户更容易使用我的代码,减少出错的机会。
选项1:定义常量
这可能是最好的选择,但有很多种方法可以做到这一点。我的想法如下。
我考虑在函数所在的模块中创建常量,但这样看起来有点乱。现在的解决方案是包含一个选项的类,但这样输入会变得很长,除非我用一些不相关且简短的东西来简化类(我确实这么做了,但感觉不太对,也不明显)。我该怎么办呢?
选项2:通过解释文档
注意:我觉得这个选项实际上并不存在……
我喜欢在文档中放置代码的想法,这样编辑器可以用来进行Tab键补全,但我不知道这个选项是否真的存在。
还有其他选项吗?
当前代码(大致上):
class C():
SORT_FIRST_AUTHOR = 'first author'
SORT_LAST_AUTHOR = 'last author'
SORT_TITLE = 'title'
#Ideally these might be selected by: my_module.search.sort_option.FIRST_AUTHOR instead of my_module.C.FIRST_AUTHOR but that's REALLY long
def search(query_string,sort = None): #Changed sort = [], to sort = None per comments
更新:(试图澄清问题)
这和这个问题有点相似,虽然我觉得答案和我想要的有些偏离,因为问题的具体情况不同。
理想情况下,我希望search()的定义能让“sort”支持Tab键补全,类似于:
def search(....):
"""
:param sort:
:values sort: 'first author'|'last author'|'title'
"""
但是,我不知道这实际上是否是一个有效的文档选项。
另外,我可以定义一些常量来实现这个功能,这样调用就变成:
search(my_a,my_b,package_name.C.SORT_FIRST_AUTHOR)
但这看起来又丑又不对。
所以,当你希望用户从一组选项中选择一个时,你该怎么做呢?
1 个回答
依赖用户正确输入字符串通常不是个好主意,因为如果字符串里有拼写错误,可能会导致一些不明显的错误。
在模块级别定义大写变量是很常见的,比如socket模块里就有:
socket.SOCK_STREAM
socket.SOCK_DGRAM
socket.SOCK_RAW
这些变量会作为参数传递给函数,里面很可能包含字符串值。
理想情况下,我们可能会选择使用:my_module.search.sort_option.FIRST_AUTHOR,而不是my_module.C.FIRST_AUTHOR,但这真的太长了。
是的,第一个选项确实有点长。不过,mymodule.SORT_FIRST_AUTHOR
这个名字听起来就合理多了。如果常量只在某个类里使用,或者这个类可能会单独从模块中导入,那么使用类变量也是合适的。
from mymodule import Searcher
s = Searcher(..., Searcher.SORT_FIRST_AUTHOR)
在常量前面加上一个共同的词(比如SORT)可以帮助编辑器在自动补全时更方便,也让常量的意思更加清晰。
你还可以考虑使用一个命名元组。
>>> SortOpts = namedtuple('SortOpts', ('FIRST_AUTHOR', 'LAST_AUTHOR'))
>>> SORT_OPT = SortOpts(FIRST_AUTHOR=0, LAST_AUTHOR=1)
>>> SORT_OPT.FIRST_AUTHOR
0
>>> SORT_OPT.FIRST_AUTHOR = 2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: can't set attribute
这样做的好处是可以保护属性不被修改,不过我觉得在大多数编辑器里,这可能不支持自动补全。