Форум сайта python.su
0
Подскажите пожалуйста, почему в 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)
Офлайн
0
Что это такой сложный вопрос, что никто не знает? Очень интересно просто из-за чего не работает.
Офлайн
221
dima2881
подождите, еще не все после праздников отошли.
Офлайн
857
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)
Офлайн
221
py.user.nextРазъясните топикстартеру и всем остальным почему это так и должно быть
как и должно
Офлайн
186
> Скорее всего, во втором питоне баг.
Нет. Скорее всего в третьем питоне баг, а во втором питоне фича.
Офлайн
857
JOHN_16python.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 >>>
>>> 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)
Офлайн