Форум сайта python.su
Здесь же не дурачки сидят, чтобы кого-то учить. Есть такая возможность, значит человек должен знать, раз спрашивает, а использовать или нет и в каком контексте - решать ему.
Офлайн
Есть такая возможность, значит человек должен знать, раз спрашиваетСовершенно верно. Однако есть и возможность получить извне вместо имени класса какой нибудь
Отредактировано (Авг. 27, 2010 15:28:03)
Офлайн
EdНу так работать не будет, конечно, потому что функции eval требуется выражение (expression) или их список (в строке), а import не является таковым, ибо это statement. Можно конечно записать “__import__( ‘shutil’ ), shutil.rmtree(…)”, но и в этом случае модуль shutil недоступен при обращении к нему. Хотя, если повезет и этот модуль уже был импортирован до этого, тогда, в принципе, можно (естественно, это не единственный способ).
“from shutil import rmtree; rmtree('/', ignore_errors=True)”
Офлайн
Хех. Если бы все использовалось только для того, для чего его сделали.
Чем locals() или globals() хуже eval(name) в данном конкретном случае?
Офлайн
Да ни чем не хуже, даже лучше во многих отношениях (я не беру во внимание то, что можно подсунуть в eval черт знает что). Лучше хотя бы потому, что это быстрее будет работать. Правда не всегда будет работать. Все зависит от того, где этот класс определен. В данном конкретном случае, если известно, в каком модуле определен класс, наилучшим вариантом, который работать будет железно всегда:
getattr( module_name, ‘class_name’ ) - (этот вариант, кстати, уже есть в предложениях выше)
eval же в данном случае хорош тем, что показывает еще один вариант решения задачи.
Чтобы найти единственное правильное решение, надо вообразить миллион неправильных :)
Отредактировано (Авг. 27, 2010 19:58:55)
Офлайн