Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 27, 2010 14:57:21

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

Преобразование строки в имя класса

Здесь же не дурачки сидят, чтобы кого-то учить. Есть такая возможность, значит человек должен знать, раз спрашивает, а использовать или нет и в каком контексте - решать ему.



Офлайн

#2 Авг. 27, 2010 15:25:03

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Преобразование строки в имя класса

Есть такая возможность, значит человек должен знать, раз спрашивает
Совершенно верно. Однако есть и возможность получить извне вместо имени класса какой нибудь
“from shutil import rmtree; rmtree('/', ignore_errors=True)”. И об этом тоже человек должен знать :)



Отредактировано (Авг. 27, 2010 15:28:03)

Офлайн

#3 Авг. 27, 2010 16:04:02

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

Преобразование строки в имя класса

Ed
“from shutil import rmtree;  rmtree('/', ignore_errors=True)”
Ну так работать не будет, конечно, потому что функции eval требуется выражение (expression) или их список (в строке), а import не является таковым, ибо это statement. Можно конечно записать “__import__( ‘shutil’ ), shutil.rmtree(…)”, но и в этом случае модуль shutil недоступен при обращении к нему. Хотя, если повезет и этот модуль уже был импортирован до этого, тогда, в принципе, можно (естественно, это не единственный способ).
Функцию eval, безусловно, сделали не для того, чтобы что-то взламывать, а чтобы иметь возможность делать то, что другими способами будет проблематично, например, либо громоздко, либо еще по каким-то причинам.

Простота - печать истины. :)



Офлайн

#4 Авг. 27, 2010 16:16:55

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Преобразование строки в имя класса

Хех. Если бы все использовалось только для того, для чего его сделали.
Чем locals() или globals() хуже eval(name) в данном конкретном случае?



Офлайн

#5 Авг. 27, 2010 16:51:20

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

Преобразование строки в имя класса

Да ни чем не хуже, даже лучше во многих отношениях (я не беру во внимание то, что можно подсунуть в eval черт знает что). Лучше хотя бы потому, что это быстрее будет работать. Правда не всегда будет работать. Все зависит от того, где этот класс определен. В данном конкретном случае, если известно, в каком модуле определен класс, наилучшим вариантом, который работать будет железно всегда:
getattr( module_name, ‘class_name’ ) - (этот вариант, кстати, уже есть в предложениях выше)
eval же в данном случае хорош тем, что показывает еще один вариант решения задачи.
Чтобы найти единственное правильное решение, надо вообразить миллион неправильных :)



Отредактировано (Авг. 27, 2010 19:58:55)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version