强制Python函数返回'tuple'类型
我遇到了一个有趣的问题,似乎解决不了。我有一个比较复杂的系统,它会调用一个格式化工具,这个工具是为我们支持的每种格式定义的一个类。类的名字是动态确定的,值的格式化是根据我们客户的API POST文档来进行的。
我遇到的问题是,有些值只需要一个键值对 (key, value)
,而有些则需要多个键值对,我把这些放在一个元组列表里 [(key1, value1), (key2, value2)]
。
我需要做的是获取这些键值对,然后创建一个元组的元组,并将其传递出去。因为顺序可能很重要,所以我不能使用字典。
这段代码的整体结构比较庞大,所以我会尽量把它拆分成小块,以便更容易阅读。
调用函数:
def map_lead(self, lead):
mapto_data = tuple()
for offer_field in self.offerfield_set.all():
field_name = offer_field.field.name
if field_name not in lead.data:
raise LeadMissingField(lead, field_name)
formatted_list = format_value(offer_field.mapto, lead.data[field_name])
if type(formatted_list).__name__ == 'list':
for item in formatted_list:
mapto_data += (item,)
elif type(formatted_list).__name__ == 'tuple':
mapto_data += (formatted_list)
return mapto_data
示例格式类型1:
@staticmethod
def do_format(key, value):
area_code, exchange, number = PhoneFormat.format_phone(value)
return [
(PhoneFormat.AREA_CODE_MAPTO, area_code),
(PhoneFormat.PHONE_EXCHANGE_MAPTO, exchange),
(PhoneFormat.VANTAGE_MEDIA_HOME_PHONE_NUMBER_MAPTO, number)
]
示例格式类型2:
@staticmethod
def do_format(key, value):
if len(value) > 3:
value = value[:3] + '-' + value[3:]
if len(value) > 7:
value = value[:7] + '-' + value[7:]
return key, value
我尝试明确地将 example_format_type2
的返回值定义为一个元组:
@staticmethod
def do_format(key, value):
if len(value) > 3:
value = value[:3] + '-' + value[3:]
if len(value) > 7:
value = value[:7] + '-' + value[7:]
formatted_value = tuple()
formatted_value += (key, value)
return formatted_value
但似乎无论我怎么做,在 calling_function
中它都被解释为一个列表。
所以,我总是得到 type(formatted_list).__name__ == 'list'
。如果我返回的是一个元组,for
循环会遍历元组中的每个项目,并把它作为一个单独的值添加到 mapto_data
元组中。
有没有办法强制Python在 example_format_type2
中返回的值在 calling_function
中被解释为元组呢?
编辑1:
结果发现问题出在 map_lead
,我在添加到 mapto_data
元组时,漏掉了最后的逗号。
2 个回答
example_format_type2
确实会返回一个元组,我很确定错误出在别的地方。比如在 format_value
这个函数里。请注意,如果你用 += 把一个元组加到一个列表里,结果会变成一个列表:
>>> a = [1, 2]
>>> a += (3, 4)
>>> print a
[1, 2, 3, 4]
另外,建议你用下面的语法来检查 formatted_list
的类型:
if type(formatted_list) is tuple:
...
我觉得你可以直接返回一个元组字面量(我不知道这是不是它的正式名称)?
>>> def test():
... return (1, 2)
...
>>> thing = test()
>>> thing
(1, 2)
>>> type(thing)
<type 'tuple'>
>>> type(thing).__name__
'tuple'