Пожалуйста, объясните это поведение Python - PullRequest
2 голосов
/ 01 апреля 2010
class SomeClass(object):
    def __init__(self, key_text_pairs = None):
        .....
        for key, text in key_text_pairs:
            ......
            ......

x = SomeClass([(1, "abc",), (2, "fff",)])

Значение key_text_pairs внутри init равно None, даже если я передаю список, как в приведенном выше утверждении. Почему это так??

Я хочу написать общий init , который может принимать все объекты итератора ...

Спасибо

Редактировать: упс .. Я хотел передать пару ключ-значение в виде кортежа ... Я просто пытался создать игрушечный пример ... Я все еще вижу то же поведение

Ответы [ 3 ]

2 голосов
/ 01 апреля 2010

Прежде всего, когда вы говорите for key, text in key_text_pairs, вы подразумеваете, что в списке есть кортежи. Я проверил ваш код в точности так, как он есть, и вот что произошло.

Измените x = SomeClass([1, 2, 3]) на x = SomeClass([(1, 1.0), (2, 2.0), (3, 3.0)]) и посмотрите, поможет ли это

Приветствия

0 голосов
/ 01 апреля 2010

Не могли бы вы опубликовать трассировку?

Это то, что я получаю, когда запускаю код:

In [1]: class SomeClass(object):
   ...:     def __init__(self, key_text_pairs = None):
   ...:         for key, text in key_text_pairs:
   ...:             print "key:", key, "text", text
   ...:             
   ...:             

In [2]: x = SomeClass([1,2,3])
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)

/home/ryan/<ipython console> in <module>()

/home/ryan/<ipython console> in __init__(self, key_text_pairs)

TypeError: 'int' object is not iterable

In [3]: x = SomeClass(zip('abc', [1,2,3]))
key: a text 1
key: b text 2
key: c text 3
0 голосов
/ 01 апреля 2010

Итак, просто глядя на этот код, вы отправили именно то, что хотите? В частности, если вы передаете список, который выглядит следующим образом:

[1, 2, 3]

Тогда я не думаю, что вы хотите попробовать извлечь это так:

for key, text in key_text_pairs

Вы можете извлечь список отдельных целых чисел в пару значений, таких как ключ / текст.

Если я запускаю этот код в том виде, в каком вы его разместили, я получаю трассировку стека:

Traceback (most recent call last):
  File "test.py", line 6, in <module>
    x = SomeClass([1, 2, 3])
  File "test.py", line 3, in __init__
    for key, text in key_text_pairs:
TypeError: 'int' object is not iterable

Вам либо нужно сделать что-то вроде этого (извлечь одно значение за раз):

class SomeClass(object):
    def __init__(self, key_text_pairs = None):
        for key in key_text_pairs:
            ....

x = SomeClass([1, 2, 3])

Или ваш исходный список необходимо изменить, чтобы он содержал пары значений, если вы собираетесь оставить этот код таким же:

x = SomeClass([('a',1),('b',2),('c',3)])

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...