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

2024-06-08 09:17:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是第三方库函数,它从文件中读取一组关键字,并应该返回一组值。只要至少有两个关键字,它就可以正确地执行此操作。但是,如果只有一个关键字,则返回原始字符串,而不是大小为1的元组。这尤其有害,因为当我试图做

for keyword in library.get_keywords():
    # Do something with keyword

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

我的问题有两个:

很明显这是库中的一个bug,我无法控制。我怎样才能最好地解决这个问题?

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

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

我明白了

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

当只有一个元素时,修改函数my_tuple以实际返回元组的最佳方法是什么?我是否需要显式地检查大小是否为1,并使用(value,)语法分别创建元组?这意味着任何有可能返回一个单值元组的函数都必须这样做,这看起来既繁琐又重复。

这个问题有什么好的解决办法吗?


Tags: 函数字符串in元素forvaluemy情况
3条回答

如果是字符串或元组,则需要以某种方式测试类型。我会这样做:

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

你的tuple_maker并不像你想象的那样。对tuple maker的一个等价定义是

def tuple_maker(input):
    return input

你看到的是tuple_maker("a string")返回一个字符串,而tuple_maker(["str1","str2","str3"])返回一个字符串列表;两者都不返回元组!

Python中的元组是由逗号而不是方括号定义的。因此(1,2)是包含值12的元组,而(1,)是包含单个值1的元组。

如其他人所指出,要将值转换为元组,请使用tuple

>>> tuple([1])
(1,)
>>> tuple([1,2])
(1,2)

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

至于第二个问题,任何变量都可以通过在其旁边放置一个,而变成一个单值元组:

>>> x='abc'
>>> x
'abc'
>>> tpl=x,
>>> tpl
('abc',)

把这两个想法放在一起:

>>> def make_tuple(k):
...     if isinstance(k,tuple):
...             return k
...     else:
...             return k,
... 
>>> make_tuple('xyz')
('xyz',)
>>> make_tuple(('abc','xyz'))
('abc', 'xyz')

注意:通常情况下,使用isinstance或任何其他需要在运行时检查对象类型的逻辑形式是不好的。但对于这个问题我看不出任何办法。

相关问题 更多 >