Domanda

Sto cercando di riscrivere la mia lib scritto in PHP in pitone. Gestisce tutte le richieste di sfinge. Nella funzione init, sto cercando di modalità di ricerca predefinito del fiammifero e, ma ho incontrato un piccolo problema. Ottengo i modi da un file di configurazione.

In PHP, è necessario utilizzare una costante come ingresso:

$this->sphinx->SetMatchMode(constant($this->conf['match_mode']));

Questo convertirà la stringa dal file di configurazione in una costante e tutto funziona. La parte difficile inizia in pitone, quando provo a fare questo:

self.sphinx.SetMatchMode(self.config['match_mode'])

I ottenere:

AssertionError in
assert(mode in [SPH_MATCH_ALL, SPH_MATCH_ANY, SPH_MATCH_PHRASE, SPH_MATCH_BOOLEAN, SPH_MATCH_EXTENDED, SPH_MATCH_FULLSCAN, SPH_MATCH_EXTENDED2]) 

In questo caso, l'input deve essere un intero, ma l'input è una stringa e non posso convertirlo perché ho un'eccezione - la stringa è SPH_MATCH_ALL.

invalid literal for int() with base 10: 'SPH_MATCH_ALL'

Quando provo questo:

print type(self.config['match_mode']) # -- string
print type(SPH_MATCH_ALL) # -- integer
print SPH_MATCH_ALL # -- 1 
print SPH_MATCH_ANY # -- 0

Quindi la mia domanda sarebbe, come posso convertire la stringa in un numero intero o qualunque cosa pensa che sia, in modo da non otterrete un errore di asserzione. Naturalmente, che ho potuto solo fare un po 'if / else, ma io non voglio questo. Esiste un modo elegante per fare questo?

È stato utile?

Soluzione

Python non ha un equivalente diretto della funzione PHP constant(). Se la costante in questione è importata da un modulo, il modo più pulito per farlo è in questo modo:

import myconstants
num = int(getattr(myconstants, self.config['match_mode']))

o se è definito in ambito globale all'interno del modulo corrente, si può fare questo:

X = 1
num = int(globals()['X'])

In entrambi i casi, si sta facendo qualcosa di leggermente rischioso lasciando all'utente il controllo quali oggetti tue offerte di codice con. Non è del tutto eval(), ma è un po 'su questa strada. È per questo che ho incluso le conversioni int() lì - dovrebbero fallire se l'utente configura il sistema con il nome di qualcosa che non è un numero intero. Ci possono essere modi più robusti per fare questo -. Io non sono a proprio agio con esso, ma è da qualche parte vicino al codice constant() PHP senza una completa riscrittura

Altri suggerimenti

Non ho familiarità con sfinge, ma si basa su domanda, vorrei provare qualcosa di simile

DEFAULT = 0
mode = getattr(self.sphinx, self.config['match_mode'], DEFAULT)
self.sphinx.SetMatchMode(mode)

Questo supponendo che il modulo sphinx definisce le modalità sotto forma

SPH_MATCH_ANY = 0
SPH_MATCH_ALL = 1
# ....

Scrivi una funzione che converte la stringa di modo alla intero corrispondente, quindi utilizzare che quando si chiama in config:

self.sphinx.SetMatchMode(modeToInt(self.config['match_mode']))

È possibile alveare via qualunque if / else bruttezza è richiesto nella funzione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top