Frage

Ich versuche, meine lib in PHP in Python geschrieben neu zu schreiben. Es kümmert sich um alle Sphinx-Anfragen. In der init-Funktion, versuche ich zu Satz Standard-Such-und Spiel-Modi, aber ich habe in ein kleines Problem laufen. Ich erhalte die Modi aus einer Konfigurationsdatei.

In PHP, müssen Sie eine Konstante als Eingabe verwendet werden:

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

Dies wird die Zeichenfolge aus Config-Datei in eine konstante und alles funktioniert konvertieren. Der schwierige Teil beginnt in Python, wenn ich versuche, dies zu tun:

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

ich:

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 diesem Fall sollte die Eingabe eine ganze Zahl sein, aber der Eingang ist ein String und ich kann es nicht konvertieren, weil ich eine Ausnahme erhalten - die Zeichenfolge SPH_MATCH_ALL ist.

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

Wenn ich versuche, dieses:

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

Also meine Frage wäre, wie kann ich die Zeichenfolge in eine ganze Zahl konvertieren oder was auch immer es denkt, es ist, so dass ich eine Assertion Fehler angezeigt werde nicht. Natürlich, das könnte ich tun, nur ein paar if / else-Anweisungen, aber ich nicht will, dass. Gibt es eine elegante Art und Weise, dies zu tun?

War es hilfreich?

Lösung

Python keine direkte Entsprechung der PHP constant() Funktion hat. Wenn die Konstante in Frage aus einem Modul importiert wird, der sauberste Weg zu tun, ist es wie folgt aus:

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

Oder wenn es auf globaler Tragweite im aktuellen Modul definiert ist, können Sie dies tun:

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

So oder so, tun Sie etwas etwas riskant, indem der Benutzer die Kontrolle zu lassen, die mit dem Code-Angebote Objekte. Es ist nicht ganz eval(), aber es ist ein kleiner Weg der Straße runter. Deshalb habe ich die int() Umwandlungen dort aufgenommen haben - sie, wenn der Benutzer konfiguriert das System mit dem Namen etwas fehlschlagen sollte, die nicht eine ganze Zahl ist. Es kann robustere Möglichkeiten, dies zu tun. - Ich bin nicht ganz zufrieden mit ihm, aber es ist irgendwo in der Nähe Ihres PHP-Code constant() ohne komplett neu geschrieben

Andere Tipps

ich mit Sphinx nicht vertraut bin, aber basierend auf Dich Frage, würde ich so etwas wie dieses

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

Das ist unter der Annahme, dass das Sphinx-Modul der Modi in der Form

definiert
SPH_MATCH_ANY = 0
SPH_MATCH_ALL = 1
# ....

Schreiben Sie die Funktion, dass Konvertiten der Modus Zeichenfolge in die entsprechende ganze Zahl ist, dann verwenden, wenn Sie rufen in der config:

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

Sie können hive weg, was auch immer, wenn / sonst Hässlichkeit in die Funktion erforderlich ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top