2013-03-12 5 views
-2

У меня возникла интересная проблема, которую я не могу решить. У меня довольно сложная система, которая вызывает инструмент форматирования, который определяется как класс для каждого поддерживаемого формата. Имя класса определяется динамически и значение форматируется на основе документации нашего клиента для POST API.Функция Force Python для возврата типа 'tuple'

Проблема, с которой я столкнулся, заключается в том, что для некоторых значений требуется одна пара ключей/значений (key, value), тогда как некоторым требуется несколько пар, которые я ввел в список кортежей [(key1, value1), (key2, value2)].

Что мне нужно сделать, это получить ключ (ы)/значение (ы) и создать кортеж кортежей и передать его для доставки. Я не могу использовать словарь, так как порядок может иметь значение позже.

Общая структура этого кода довольно обширна, поэтому я попытаюсь разбить ее на мелкие кусочки для удобства чтения.

calling_function:

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 как кортеж?

EDIT1:

Оказывается, проблема была в map_lead где я добавлял к mapto_data кортежа. Я пропустил заднюю запятую.

+0

К сожалению, я не вас. То, что вы называете «call_function» (это «map_lead», справа) даже не пытается рассуждать о типе его параметров. Вы уверены, что возвращение 'tuple' - это то, чего вы хотите достичь? Какова настоящая цель кода? – J0HN

+4

примечание стороны: вы должны заменить 'type (formatted_list) .__ name__ == 'list'' с' isinstance (formatted_list, list) '. И то же самое для кортежа –

+0

Не думаю, что я понял, что вы делаете - кажется, вы хотите, чтобы какая-то система отправки (но, возможно, для этого использовала классы), но вместо этого она не кажется так что, но в то же время вы пытаетесь заставить себя казаться !? Просто дайте нам главный абзац на английском языке, что вы пытаетесь сделать, без каких-либо технических деталей ... (это должно начинаться с «Что я хотел бы достичь ...» –

ответ

1

Я считаю, что вы можете просто вернуть литерал кортежа (idk, если это то, что он называется)?

>>> def test(): 
...  return (1, 2) 
... 
>>> thing = test() 
>>> thing 
(1, 2) 
>>> type(thing) 
<type 'tuple'> 
>>> type(thing).__name__ 
'tuple' 
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: 
    ... 
Смежные вопросы