强制Python函数返回'tuple'类型

-2 投票
2 回答
1381 浏览
提问于 2025-04-17 18:51

我遇到了一个有趣的问题,似乎解决不了。我有一个比较复杂的系统,它会调用一个格式化工具,这个工具是为我们支持的每种格式定义的一个类。类的名字是动态确定的,值的格式化是根据我们客户的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 个回答

0

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:
  ...
1

我觉得你可以直接返回一个元组字面量(我不知道这是不是它的正式名称)?

>>> def test():
...     return (1, 2)
... 
>>> thing = test()
>>> thing
(1, 2)
>>> type(thing)
<type 'tuple'>
>>> type(thing).__name__
'tuple'

撰写回答