Найти - Пользователи
Полная версия: Различия между python 2 и 3
Начало » Python для новичков » Различия между python 2 и 3
1
dima2881
Подскажите пожалуйста, почему в 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)
dima2881
Что это такой сложный вопрос, что никто не знает? Очень интересно просто из-за чего не работает.
JOHN_16
dima2881
подождите, еще не все после праздников отошли.
py.user.next
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
>>>

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

Нет. Скорее всего в третьем питоне баг, а во втором питоне фича.
py.user.next
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.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB