Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 10, 2016 03:38:28

dima2881
Зарегистрирован: 2016-01-09
Сообщения: 39
Репутация: +  0  -
Профиль   Отправить e-mail  

Различия между python 2 и 3

Подскажите пожалуйста, почему в python 2 этот код работает, а в python 3 нет?

class TestMe:
    CONSTANT = (('1', 'One'), ('2', 'Two'), ('3', 'Three'))
    FILTER = (0, 1)
 
    test1 = ','.join([x[1] for x in CONSTANT])
    test2 = ','.join([CONSTANT[x][1] for x in FILTER])
 
 
t = TestMe()
 
print(t.test1)
print(t.test2)

Офлайн

#2 Янв. 10, 2016 16:17:24

dima2881
Зарегистрирован: 2016-01-09
Сообщения: 39
Репутация: +  0  -
Профиль   Отправить e-mail  

Различия между python 2 и 3

Что это такой сложный вопрос, что никто не знает? Очень интересно просто из-за чего не работает.

Офлайн

#3 Янв. 10, 2016 22:56:11

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Различия между python 2 и 3

dima2881
подождите, еще не все после праздников отошли.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#4 Янв. 11, 2016 04:28:29

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Различия между python 2 и 3

dima2881
Очень интересно просто из-за чего не работает.
Поменял квадратные скобки на list(), стало выпадать, как и должно.
>>> class TestMe:
...     CONSTANT = (('1', 'One'), ('2', 'Two'), ('3', 'Three'))
...     FILTER = (0, 1)
...     
...     test1 = ','.join([x[1] for x in CONSTANT])
...     test2 = ','.join(list(CONSTANT[x][1] for x in FILTER))
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 6, in TestMe
  File "<stdin>", line 6, in <genexpr>
NameError: global name 'CONSTANT' is not defined
>>>

Скорее всего, во втором питоне баг.



Отредактировано py.user.next (Янв. 11, 2016 04:29:15)

Офлайн

#5 Янв. 11, 2016 11:05:15

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Различия между python 2 и 3

py.user.next
как и должно
Разъясните топикстартеру и всем остальным почему это так и должно быть



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#6 Янв. 11, 2016 11:13:12

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2843
Репутация: +  186  -
Профиль   Отправить e-mail  

Различия между python 2 и 3

> Скорее всего, во втором питоне баг.

Нет. Скорее всего в третьем питоне баг, а во втором питоне фича.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#7 Янв. 11, 2016 11:37:17

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Различия между python 2 и 3

JOHN_16
Разъясните топикстартеру и всем остальным почему это так и должно быть
python.org. 2. naming
This means that the following will fail:
class A:
    a = 42
    b = list(a + i for i in range(10))

Во втором питоне
>>> class A:
...     a = 42
...     b = list(a + i for i in range(10))
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in A
  File "<stdin>", line 3, in <genexpr>
NameError: global name 'a' is not defined
>>>

Во втором питоне заменяем только list() на квадратные скобки
>>> class A:
...     a = 42
...     b = [a + i for i in range(10)]
... 
>>>
Должен выдавать исключение, как написано в документации, но не выдаёт.

Хотя да, в документации честно написано, что это только к генераторным выражениям относится. (Списочные включения не являются генераторными выражениями.)

Rodegast
Нет. Скорее всего в третьем питоне баг, а во втором питоне фича.
Не, скорее было так: они сделали только для генераторных выражений, а потом это поняли и добавили списочные включения.

Вот это прослеживается:
Как во втором было только про генераторные выражения
The scope of names defined in a class block is limited to the class block; it does not extend to the code blocks of methods – this includes generator expressions since they are implemented using a function scope.
А в третьем добавили к генераторным выражениям все включения
The scope of names defined in a class block is limited to the class block; it does not extend to the code blocks of methods – this includes comprehensions and generator expressions since they are implemented using a function scope.



Отредактировано py.user.next (Янв. 11, 2016 11:49:36)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version