在Python中处理单值元组的最佳实践是什么?

ire*_*ses 13 python tuples

我正在使用第三方库函数,它从文件中读取一组关键字,并且应该返回一个值元组.只要至少有两个关键字,它就会正确执行此操作.但是,在只有一个关键字的情况下,它返回一个原始字符串,而不是一个大小为1的元组.这特别有害,因为当我尝试做类似的事情时

for keyword in library.get_keywords():
    # Do something with keyword
Run Code Online (Sandbox Code Playgroud)

,在单个关键字的情况下,for迭代迭代字符串的每个字符,这在运行时或其他情况下不会引发异常,但对我来说却完全没用.

我的问题是双重的:

显然,这是库中的一个错误,这是我无法控制的.我怎样才能最好地解决它?

其次,一般来说,如果我正在编写一个返回元组的函数,那么确保使用一个元素的元组的正确生成的最佳实践是什么?例如,如果我有

def tuple_maker(values):
    my_tuple = (values)
    return my_tuple

for val in tuple_maker("a string"):
    print "Value was", val

for val in tuple_maker(["str1", "str2", "str3"]):
    print "Value was", val
Run Code Online (Sandbox Code Playgroud)

我明白了

Value was a
Value was  
Value was s
Value was t
Value was r
Value was i
Value was n
Value was g
Value was str1
Value was str2
Value was str3
Run Code Online (Sandbox Code Playgroud)

my_tuple当只有一个元素时,修改函数以实际返回元组的最佳方法是什么?我是否明确需要检查大小是否为1,并使用(value,)语法单独创建元组?这意味着任何有可能返回单值元组的函数都必须这样做,这似乎是hacky和重复.

这个问题有一些优雅的通用解决方案吗?

Len*_*bro 17

你需要以某种方式测试类型,如果它是一个字符串或一个元组.我这样做:

keywords = library.get_keywords()
if not isinstance(keywords, tuple):
    keywords = (keywords,) # Note the comma
for keyword in keywords:
    do_your_thang(keyword)
Run Code Online (Sandbox Code Playgroud)


MAK*_*MAK 8

对于你的第一个问题,我不确定这是否是最好的答案,但我认为你需要检查自己返回的值是字符串还是元组并相应地采取行动.

至于你的第二个问题,任何变量都可以通过放置一个变量来变成单值元组,:

>>> x='abc'
>>> x
'abc'
>>> tpl=x,
>>> tpl
('abc',)
Run Code Online (Sandbox Code Playgroud)

将这两个想法放在一起:

>>> def make_tuple(k):
...     if isinstance(k,tuple):
...             return k
...     else:
...             return k,
... 
>>> make_tuple('xyz')
('xyz',)
>>> make_tuple(('abc','xyz'))
('abc', 'xyz')
Run Code Online (Sandbox Code Playgroud)

注意:恕我直言,使用isinstance或任何其他形式的逻辑需要在运行时检查对象的类型通常是一个坏主意.但对于这个问题,我没有看到任何解决方法.