我正在编写一个Python函数(2.7),其中一个输入参数是一个字符串。字符串值应该是几个值之一。
即。参数,在这种情况下" sort"可以是列表中的任何一个['第一作者' '最后一位作者' ' title'](列表实际上有点长)
是否有一种帮助用户提供此输入的好方法(通过选项卡完成)。最终目标是尝试改进用户界面,以便他们更容易使用我的代码并减少错误。
选项1:定义常量
这可能是最好的选择,但有多种方法可以做到这一点。我的方法如下。
我考虑在函数所在的模块中创建常量,但这看起来很混乱。我目前的解决方案是包含一个带有选项的类,但是这使得输入真的很长,除非我作弊并使这个类变得荒谬和简短(这是我已经完成但看起来错误且不明显) 。我该怎么办?
选项2:通过解释文档
注意:我不认为这个选项确实存在......
我喜欢将代码放在文档中的想法,编辑可以使用它来执行tab-complete,但我不知道这个选项存在。
其他选项?
当前代码(大致):
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
更新:(试图澄清问题)
这有点类似于这个问题,虽然我认为由于问题的具体细节,答案与我所寻找的不同。
Pythonic way to have a choice of 2-3 options as an argument to a function
理想情况下,我希望search()的定义允许选项卡完成" sort"通过规范,如:
def search(....):
"""
:param sort:
:values sort: 'first author'|'last author'|'title'
"""
但是,我并不知道这实际上是一个有效的文档选项。
或者,我可以定义一些允许这样做的常量,以便调用成为:
搜索(my_a,my_b,package_name.C.SORT_FIRST_AUTHOR)
但这看起来很丑陋和错误。
因此,当您希望用户从一组选项中传入一个选项时,您是如何做到的?
答案 0 :(得分:1)
依赖用户正确键入字符串文字通常是一个坏主意,因为如果字符串包含拼写错误,它可能导致无提示错误。
通常在模块级别定义大写变量,例如套接字模块具有
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)对常量进行前缀将在选项卡完成条目时帮助编辑,并使常量更具描述性。
您还可以考虑使用namedtuple
>>> 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
这样做的好处是可以保护属性不被更改,但我不认为这可以在大多数编辑器中使用制表符完成。