-2

我遇到了一个我似乎无法解决的有趣问题。我有一个非常复杂的系统,它调用格式化工具,它被定义为我们支持的每种格式的类。类名是动态确定的,值是根据我们客户的 API POST 文档格式化的。

我遇到的问题是有些值需要一个键/值对(key, value),而有些需要多个对,我将它们放入一个 tuples 列表中[(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

example_format_type1:

@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)
        ]

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:]
    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元组的位置。我错过了那里的尾随逗号。

4

2 回答 2

1

我相信你可以只返回一个元组文字(idk,如果它被称为)?

>>> def test():
...     return (1, 2)
... 
>>> thing = test()
>>> thing
(1, 2)
>>> type(thing)
<type 'tuple'>
>>> type(thing).__name__
'tuple'
于 2013-03-12T21:06:52.263 回答
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:
  ...
于 2013-03-12T21:20:54.753 回答