PROSZĘ ZWRÓCIĆ UWAGĘ: NIE dotyczy to użycia eval(), dotyczy to potencjalnej jakości (lub jej braku) książki, z której jest ona używana i której się uczy. SO ma już niezliczone wątki dotyczące eval() w Pythonie.Python - książka Zelle używa eval(), czy to źle?
Ryzykując, aby zaprosić gniew i spadki SO, zdecydowałem się zadać to pytanie, na wszelki wypadek. Proszę, weź mnie. Wypróbowałem Google i SO sam dla tego konkretnego pytania (jak widać) i nic nie dostałem. Może jednak jestem ślepy.
To pytanie dotyczy użycia notorycznej funkcji eval().
Jest stosunkowo dobrze znana (i dobrze przeglądowi, jak widać) książka Johna Zelle: http://www.amazon.com/Python-Programming-Introduction-Computer-Science/dp/1590282418/ref=pd_sim_b_3
Technicznie rzecz biorąc, jest to książka, która wykorzystuje CS1 Python jako język programowania. Uczciwy, ten rodzaj bierze na siebie odpowiedzialność z barków autora ("Hej, próbuję cię tutaj nauczyć czegoś szerszego, nie wszystkie te szczegóły składni i bezpieczeństwa"), ale kiedy zacząłem czytać, zauważyłem, że dosłownie pierwszy przykład, wykorzystanie
x = eval(input("Enter your number: "))
gdzie x powinno być int a więc musimy konwertować dane wprowadzone przez użytkownika do wew.
Używam Pythona 2.7.4, a książka jest o Pythonie 3, więc od samego początku miałem sporo problemów z print() i input() oraz eval() i musiałem zrobić kilka badania, aby przykłady zadziałały. W trakcie moich badań czytałem niezliczone opinie o eval() w Pythonie (głównie tutaj na SO), które sprowadzają się do tego, że prawie zawsze jest złe, ryzyko bezpieczeństwa, niepotrzebne obciążenie techniczne i tak dalej. Pytania użytkowników były dużo bardziej skomplikowane (jeden z nich dotyczył używania eval() podczas wykonywania projektu wxPython), więc nie mogę ręczyć za całkowite podobieństwo między moim przypadkiem a ich przypadkami, ale nadal ...
Przyznaję więc, że nie jestem zbyt daleko w książce, ale doszedłem do punktu, w którym, nieco później, autor wyjaśnił użycie eval() bez żadnego odniesienia do jego kontrowersyjnej natury. W zasadzie powiedział to, co właśnie powiedziałem: potrzebujemy x, aby ostatecznie być int, więc jest to przydatny sposób na zrobienie tego. I wydaje się, że używa go zawsze.
Moje pytanie brzmi następująco: jeśli od samego początku autor popełnia taki błąd (czy NIE jest to błąd?), Może coś tu nie istnieje), czy jest to książka, od której warto się uczyć? Wierzę, że pan Zelle jest świetnym nauczycielem CS i pokazuje, ale niezależnie od tego, czy tego chce, czy nie, ludzie będą nadal uczyć się Pythona również z jego książki, oprócz algorytmów i sztuki programowania. Czy warto zatem nauczyć się Pythona z książki, która milczy nad tak pozornie uniwersalnym zagadnieniem w społeczności Pythona? Nie chcę, aby pan Zelle był hackerem w Pythonie i odkrywał wszystkie jego sekrety, ale takie małe szczegóły mogą złamać kogoś, kto sam się uczy/sam się uczy. Jaka będzie twoja rada w odniesieniu do tego materiału do nauki?
P.S. Z drugiej strony, sprawienie, że od samego początku robię sporo badań i eksperymentów (nieświadomie) jest całkiem niezłe :-)
Dziękuję!
Myślałem, że eval był zły tylko w JavaScript –
@JasonSperske Zło jest wszędzie – jamylak
Sugerowanie eval() zamiast int() wydaje się błędne. –