2009-08-02 2 views
3

Ich verwende diesen REST Web-Service, die verschiedene Templat-Strings als Urls gibt, zum Beispiel:Python-String Templater

"http://api.app.com/{foo}" 

In Ruby kann ich dann

url = Addressable::Template.new("http://api.app.com/{foo}").expand('foo' => 'bar') 

verwenden

zu erhalten
"http://api.app.com/bar" 

Gibt es eine Möglichkeit, dies in Python zu tun? Ich kenne%() -Templates, aber offensichtlich funktionieren sie hier nicht.

Antwort

2

Verwenden Sie keinen schnellen Hack.

Was dort verwendet wird (und implementiert von Adressable) sind URI Templates. In Python scheint es dafür mehrere Bibliotheken zu geben, zum Beispiel: uri-templates. described_routes_py hat auch einen Parser für sie.

4

In Python 2.6 können Sie dies tun, wenn Sie genau das Syntax benötigen

from string import Formatter 
f = Formatter() 
f.format("http://api.app.com/{foo}", foo="bar") 

Wenn Sie eine frühere Python-Version verwenden müssen, dann können Sie entweder die 2.6 Formatierungsklasse oder Handwalze einen Parser/regex kopieren zu TU es.

0

Ich kann Ihnen keine perfekte Lösung geben, aber Sie könnten versuchen, string.Template zu verwenden. Sie entweder Vorprozess eingehende URL und dann string.Template direkt verwenden, wie

In [6]: url="http://api.app.com/{foo}" 
In [7]: up=string.Template(re.sub("{", "${", url)) 
In [8]: up.substitute({"foo":"bar"}) 
Out[8]: 'http://api.app.com/bar' 

Vorteil des Standard „$ {...}“ unter Syntax für Ersatzkennungen. Oder Sie Unterklasse string.Template die Kennung Muster zu steuern, wie

class MyTemplate(string.Template): 
    delimiter = ... 
    pattern = ... 

aber ich habe das nicht herausgefunden.