Podam przykład, w którym użyłem eval
i gdzie uważam, że był to najlepszy wybór.
Pisałem proste narzędzie do testowania oprogramowania ... coś do sprawdzenia, czy ćwiczenia studentów były zgodne z wymaganiami zadania.Celem było udostępnienie prostego pliku konfiguracyjnego służącego jako specyfikacja testu (aby obejść problem "kurczaków i jaj" używania języka programowania do opisywania/dokumentowania/implementowania przypadków testowych dla elementarnych przydziałów programowania) .
Oparłem swoją uprząż na ConfigParser w standardowych bibliotekach. Jednak chciałam zdolność do reprezentowania dowolne ciągi Python (w tym interpolacji \ n \ t, a zwłaszcza każdy interpolowana hex zakodowane znaki ASCII wartości odczytu z niego.
Moje rozwiązanie było try
wokół parsed_string=eval('''%s''' % cfg_read_item)
następnie a try
potrójnej wersji podwójnej ("" "% s" "") tego samego.
Jest to przypadek, w którym alternatywą byłoby napisanie (lub znalezienie wcześniej napisanego) parsera językowego w języku Python Ryzyko jest minimalne (nie obawiam się, że kod przesłany przez studenta oszuka mój parser, złamie jego więzienie, usunie wszystkie moje pliki, wyśle numery kart kredytowych do Rumunii itd.) *
* (Częściowo dlatego, że testowałem je pod Linuksem z niezaufanego konta bez głowy).
Jak już powiedzieli inni, istnieją inne przypadki użycia, w których budujesz kod z szablonu na podstawie danych wejściowych i potrzebujesz wykonać ten kod (programowanie meta). Zawsze powinieneś być w stanie wykonać te zadania w inny sposób. Jednak zawsze, gdy ta alternatywa wymaga wysiłku związanego z kodowaniem, który zbliża się do napisania ogólnego parsera/kompilatora/języka tłumaczącego dla języka polskiego, lepszym podejściem może być eval
.
Fakt: rzeczy takie jak 'eval' są bardzo rzadko ważnym wyborem i tylko wtedy, gdy ciąg podawany do nich jest znany jako bezpieczny. – delnan
Spróbuj wyszukać je w plikach kodu źródłowego Python w bibliotece standardowej Python. To zawsze jest ciekawe miejsce do rozpoczęcia, jeśli chcesz, aby podstawowe funkcje Pythona były dobrze wykorzystane. –
'exec' i' eval' mogą być całkiem przydatne w [codegolfing] (https://codegolf.stackexchange.com/). – Wrzlprmft