函数输入python的字符串选项

时间:2014-03-13 03:49:02

标签: python tab-completion

我正在编写一个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)

但这看起来很丑陋和错误。

因此,当您希望用户从一组选项中传入一个选项时,您是如何做到的?

1 个答案:

答案 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

这样做的好处是可以保护属性不被更改,但我不认为这可以在大多数编辑器中使用制表符完成。