[Python] Python web messaggi in Post e link a file in differenti directory

enrico franchi enrico.franchi a gmail.com
Ven 7 Giu 2013 12:22:16 CEST


2013/6/6 Daniele Varrazzo <piro a develer.com>:

> Spiegami la differenza tra import ed eval.

Direi che la questione principale e' che mentre ci vuole
un'atteggiamento pro-attivo da parte dello sviluppatore per creare un
problema con import [0][1], con eval basta una disattenzione.

E' chiaro che se ad eval passi solo qualcosa di sanitizzato in varia
maniera non corri nessun rischio particolare. Il problema e' che
spesso, vista la potenza di eval, molti appena scopertolo ne abusano.
Questo non vuole dire ovviamente *non usare eval*.

Credo che la posizione di lisper su eval sia sintomatica: eval c'e' da
piu' di 50 anni.
La prima risposta qua mi sembra molto valida:

http://stackoverflow.com/questions/2571401/why-exactly-is-eval-evil

abstract:
per i principianti: in generale non e' necessario, ci sono metodi piu'
robusti di fare le stesse cose
per gli un po' meno principianti: ci sono le macro
A general important reason to avoid EVAL: it is often used for ugly hacks.

Ora, concretizziamo su Python. Sui principianti (o su quelli che anche
se principianti non sono), spesso e volentieri ci sono altri modi di
fare le cose, che sono, a mio avviso, piu' strutturati e puliti.

Ci sono anche casi in cui eval e' semplicemente la strada piu' comoda
e sensata, senza passare per tre metaclassi e due class-decorator.
Specie perche' noi non abbiamo le macro. Vedi per esempio
l'implementazione di Raymond delle namedtuples -- almeno, credo sia di
Raymond --, che alla fine dei conti chiama exec su uno stringone
Python. E non mi sognerei di dire che e' insicuro: gli input sono ben
controllati e comunque e' qualcosa che uso al posto della definizione
di una classe... dove potrei comunque fare le peggio cose, e' input
mio, non input utente.

Pero' la regola, nel dubbio, meglio evitare features potenzialmente
pericolose, a mio avviso sta comunque in piedi.


---
[0] per esempio prendere una stringa dall'utente, salvarla in un
modulo e importarla.
[1] a naso, il caso in cui si usa import per un file di configurazione
e' il cugino buono di quello la sopra: non e' insicuro nel senso che
chi scrive la configurazione e' chi esegue il programma, su una
macchina su cui ha i permessi, etc etc etc. E' anche vero che va
valutato il rapporto costo/beneficio fra avere un file di
configurazione turing-completo -- quindi flessibilita' massima -- e il
fatto che appunto, errori di configurazione sono in generale piu'
difficili da capire -- perche' il parsing e' fatto da Python, che di
per se non ha idea della semantica intesa della configurazione, ma sa
solo eseguire python --.


--
.
..: -enrico-


Maggiori informazioni sulla lista Python