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

Простота - печать истины. :)
Ed
Хех. Если бы все использовалось только для того, для чего его сделали.
Чем locals() или globals() хуже eval(name) в данном конкретном случае?
Isem
Да ни чем не хуже, даже лучше во многих отношениях (я не беру во внимание то, что можно подсунуть в eval черт знает что). Лучше хотя бы потому, что это быстрее будет работать. Правда не всегда будет работать. Все зависит от того, где этот класс определен. В данном конкретном случае, если известно, в каком модуле определен класс, наилучшим вариантом, который работать будет железно всегда:
getattr( module_name, ‘class_name’ ) - (этот вариант, кстати, уже есть в предложениях выше)
eval же в данном случае хорош тем, что показывает еще один вариант решения задачи.
Чтобы найти единственное правильное решение, надо вообразить миллион неправильных :)
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