[Python] alternative ad eval

Dario Bertini berdario a gmail.com
Mar 18 Mar 2014 13:27:34 CET


Sarebbe interessante vedere i requisiti per capire se prevedano
effettivamente che l'utente possa passare qualunque oggetto python
(magari da loro definito)...

comunque:

2014-03-18 9:14 GMT+01:00 Balan Victor <balan.victor0 at gmail.com>:
>>
>> Ehm.. con la grammatica del linguaggio che vuoi parsare.
>>
>> Ma lascia che te lo dica... secondo me rischi di ficcarti in un mezzo
>> ginepraio. Il fatto che tu abbia bisogno di questo secondo campo cosi'
>> flessibile non ottimo indice che le cose saranno facili.
>>
>> Per il resto puoi definirti un linguaggio che fa tutto quello che ti pare,
>> ma non sarebbe meglio limitarsi ad un set di check prefabbricati?
>
>
> ho provato a fare qualcosa.... http://pastebin.com/6038GUEP#
> però come parser immagino non intendevi proprio questo
>


Come parser è parecchio semplicistico, ma se davvero hai sempre solo

<op> <space> <value>

può bastare

ovviamente, perdi la possibilità di usare l'intera algebra booleana se
ti limiti ad una sola operazione per espressione

piccoli appunti:

- usa split() senza argomenti, se è possibile che <op> e <value> siano
separati da più caratteri di whitespace
- `True if re.match(pattern, _string) else False` non è necessario,
basta `bool(re.match(pattern, _string))`... potresti scrivere
str: {
  'match': lambda *a: bool(re.match(*a))
}
- type("a") e type(True) non restituiscono string e boolean, ma str e bool

per il resto, se questa non è un'api e l'utente ci deve interagire
tramite un file di configurazione/una gui... come ottieni il value da
confrontare?

mi spiego: dovresti parsare anche il valore fornito

eval(string.split()[0]) ovviamente non è sufficiente per impedire che
vengano fornite delle espressioni, invece che dei semplici valori,
visto che questo filtrerebbe anche stringhe contenenti spazi

dai un'occhiata al modulo ast:
http://docs.python.org/3.4/library/ast.html

-- 
xmpp: berdario at gmail.com
bitmessage: BM-2cTYXfGiSTsnx3righ6aHcJSWe4MV17jDP
gpg fingerprint: 3F8D53518012716C4EEF7DF67B498306B3BF75A0 (used just
for signing commits)


Maggiori informazioni sulla lista Python