|
431 / 302 / 90
Регистрация: 03.12.2015
Сообщений: 741
|
||||||
Переменные класса21.11.2018, 15:11. Показов 5427. Ответов 20
Метки нет (Все метки)
0
|
||||||
| 21.11.2018, 15:11 | |
|
Ответы с готовыми решениями:
20
Переменные вне класса (asterisk agi)
|
| 21.11.2018, 16:49 | |
|
Не по теме: ошибся
0
|
|
|
757 / 306 / 190
Регистрация: 20.05.2016
Сообщений: 593
|
|
| 21.11.2018, 17:20 | |
Сообщение было отмечено vrm2 как решение
Решение
list comprehension компилируется в функцию, т.е. это как бы обычная функция со свей областью видимости. Штука в том, что тело класса - не создает или не является замыканием для вложенных функций, т.е. как Вам хорошо известно, любые переменные, объявленные в теле класса невидимы внутри методов (и вложенных функций).
3
|
|
|
|
||||||||||||
| 21.11.2018, 17:35 | ||||||||||||
0
|
||||||||||||
|
757 / 306 / 190
Регистрация: 20.05.2016
Сообщений: 593
|
|||||||||||
| 21.11.2018, 17:45 | |||||||||||
|
Да.
dis
1
|
|||||||||||
|
|
||||||
| 21.11.2018, 17:53 | ||||||
|
shsv,
Я так делал (весь код Foo) и dis мне показал
0
|
||||||
|
757 / 306 / 190
Регистрация: 20.05.2016
Сообщений: 593
|
||||||
| 21.11.2018, 17:55 | ||||||
|
Можно ещё глянуть что-то типа
0
|
||||||
|
431 / 302 / 90
Регистрация: 03.12.2015
Сообщений: 741
|
|||||||
| 21.11.2018, 17:55 [ТС] | |||||||
0
|
|||||||
|
757 / 306 / 190
Регистрация: 20.05.2016
Сообщений: 593
|
|
| 21.11.2018, 18:01 | |
|
Garry Galler, а что именно передаете dis, если скормить просто Foo, должен вывести тело метода.
vrm2, а оно и не срабатывает.
0
|
|
|
431 / 302 / 90
Регистрация: 03.12.2015
Сообщений: 741
|
|||||||
| 21.11.2018, 18:23 [ТС] | |||||||
0
|
|||||||
|
|
|||||||||||
| 21.11.2018, 18:32 | |||||||||||
|
shsv,
Просто строку передаю:
Кликните здесь для просмотра всего текста
0
|
|||||||||||
|
431 / 302 / 90
Регистрация: 03.12.2015
Сообщений: 741
|
|
| 21.11.2018, 18:47 [ТС] | |
|
0
|
|
|
757 / 306 / 190
Регистрация: 20.05.2016
Сообщений: 593
|
||||||
| 21.11.2018, 19:32 | ||||||
|
Если глянуть на вывод dis, можно заметить, что выражение после in вычисляется до того как будет вызвана новосозданная функция '<listcomp>', результат этого выражения запихивается на макушку стека, и затем передается в качестве позиционного аргумента функции '<listcomp>'.
Т.е. на примере Garry Galler
1
|
||||||
|
|
|||
| 21.11.2018, 19:35 | |||
|
Добавлено через 1 минуту
0
|
|||
|
431 / 302 / 90
Регистрация: 03.12.2015
Сообщений: 741
|
|||||||||||||||||||||||||||||||
| 21.11.2018, 20:14 [ТС] | |||||||||||||||||||||||||||||||
|
Сделал сравнение
Кликните здесь для просмотра всего текста
Первый вариант (НЕ рабочий):
Кликните здесь для просмотра всего текста
Отличаются только строчки LOAD_FAST (x) - в рабочем варианте LOAD_GLOBAL (xs) - в нерабочем варианте Добавлено через 51 секунду Что в данном случае является глобальными переменными для list comprehension? Добавлено через 32 секунды Т.е. где питон ищет xs? Добавлено через 3 минуты Для нерабочей версии интересен следующий момент: - в правой части for для загрузки переменной используется LOAD_NAME (xs) - в левой части for используется LOAD_GLOBAL (xs) Разве это справедливо?
0
|
|||||||||||||||||||||||||||||||
|
|
|
| 21.11.2018, 20:36 | |
|
vrm2,
Я так понял (из пояснений shsv) выражение справа от in уже вычислено до того, как создана и вызвана сам функция list comprehension<listcomp>. И поэтому в вашем рабочем варианте это вычисленное значение просто передается в функцию как аргумент и никакой связи с именем xs не требуется. А во вторым случае делается попытка загрузить в левую часть выражения именно xs с глобального уровня, но не выходит, так как xs не объявлена как global. Если объявить - то все ОК.
1
|
|
|
431 / 302 / 90
Регистрация: 03.12.2015
Сообщений: 741
|
||
| 21.11.2018, 22:06 [ТС] | ||
|
Я до сегодняшнего дня не разделял области видимости слева и справа от for в генераторах списках. А оно вон как ... Считаю, что в генераторах в любом месте должна быть возможность использовать все переменные, находящиеся в области видимости. Не должны выражения в генераторах ничем отличаться от обычных выражений.
0
|
||
|
|
|||||||||||||
| 21.11.2018, 23:19 | |||||||||||||
Сообщение было отмечено vrm2 как решение
Решение
vrm2,
Вычисление выражения до его использования - обычная оптимизация. Тут вся разница в том как создается функция и как создается класс.
Но стоит заменить определение верхней функции на class и все начинает работать по другому.
И далее по книжке Дрейка:
1
|
|||||||||||||
|
431 / 302 / 90
Регистрация: 03.12.2015
Сообщений: 741
|
||
| 21.11.2018, 23:59 [ТС] | ||
|
А почему почему работает именно так, я разобрался, спасибо shsv и Garry Galler.
0
|
||
|
|
||||||
| 22.11.2018, 01:54 | ||||||
|
В общем вот некий окончательный итог, который я нарыл из одной статьи на хабре.
1) Области видимости, вложенные внутрь определения класса, игнорируют имена, привязанные к уровню класса. В обоих версиях Python. Зачем так нужно - не знаю. Создателям виднее. 2) Генерирующее выражение (i for i in range(10)) имело собственную область видимости уже в Python 2. Зачем нужно? Думаю, для изоляции от случайного изменения значения одноименных переменных, объявленных выше по коду. (N.B. Обычный цикл for все еще не имеет своей собственной области видимости для переменной цикла, что, на мой взгляд, очень плохо.) 3) Начиная с Python 3 генераторы списков (list comprehensions) тоже имеют свои области видимости. Думаю, ввели для консистентности с генераторными выражениями. Либо что-то поменялось в реализации list comprehensions. То есть внутренняя переменная i в [x for i in range(10)] более недоступна за пределами выражения list comprehensions, а переменная x (вследствие пункта 1) будет искаться исключительно в глобальном скоупе (если list comprehensions находится в области определения класса), игнорируя scope класса, либо, просто в вышестоящем scope, если выражение находится внутри функции. Пока у list comprehensions не было своего приватного скоупа - имя x могло браться с локальной области видимости класса, который был у list comprehensions общим со вмещающим классом.
0
|
||||||
| 22.11.2018, 01:54 | |
|
Помогаю со студенческими работами здесь
20
Класс: Как правильно создавать переменные класса? Как сделать вывод функции в другие переменные вне класса? Имеется выражение, левая часть - переменные, а правая- значения, которые будут записаны в эти переменные
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2.
При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
|
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут.
https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc
Первый документ красиво выглядит, но без схемы.
Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
|
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере".
Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
|
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти".
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2.
В качестве источника данных. . .
|
|
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер
Написал заготовку:
dotnet new console --aot -o UrlHandler
var items = args. Split(":");
var tag = items;
var id = items;
var executable = args;. . .
|
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3.
Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
|
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений.
9TO2GP2bpX4
a42b81fb172ffc12ca589c7898261ccb/
https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/
Слева синяя линия -. . .
|
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. .
Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
|