2012-07-05 15 views
10

Jak dołączyć zmienną do pojedynczego cytatu w pythonie? To prawdopodobnie bardzo proste, ale nie mogę tego dostać! Muszę zakodować kod zmiennej term. Term jest wprowadzany w formularzu przez użytkownika i jest przekazywany do funkcji, w której jest kodowana przez adres URL term=urllib.quote(term). Jeśli użytkownik wprowadził "komputer jabłkowy" jako termin, po kodowaniu adresu URL byłby to "apple% 20comptuer". Chcę, aby termin był otoczony pojedynczymi cudzysłowami przed kodowaniem URL-em, aby był to "komputer jabłkowy", a następnie po kodowaniu adresu URL "% 23apple% 20computer% 23". Muszę przekazać termin do adresu URL i nie zadziała, dopóki nie użyję tej składni. Jakieś sugestie?Dołączanie zmiennej do pojedynczego cudzysłowu w Pythonie

Przykładowy kod:

import urllib2 
import requests  

def encode(): 
     import urllib2 
     query= avariable #The word this variable= is to be enclosed by single quotes 
     query = urllib2.quote(query) 
     return dict(query=query) 

def results(): 

    bing = "https://api.datamarket.azure.com/Data.ashx/Bing/SearchWeb/Web?Query=%(query)s&$top=50&$format=json" 
    API_KEY = 'akey' 

    r = requests.get(bing % encode(), auth=('', API_KEY)) 
    return r.json 

Odpowiedz

23

Istnieją trzy sposoby:

  1. konkatenacji

    term = urllib.quote("'" + term + "'") 
    
  2. starym stylu ciąg formatowanie

    term = urllib.quote("'%s'" % (term,)) 
    
  3. nowym stylu ciąg formatowanie

    term = urllib.quote("'{}'".format(term)) 
    
+0

Dziękuję za wyczerpującą odpowiedź – adohertyd

3
def wrap_and_encode(x): 
    return encode("'%s'" % x) 

powinno być to, czego szukasz.

7

można po prostu użyć interpolacji wyrażenie:

>>> term = "foo" 
>>> "'%s'" % term 
"'foo'" 
2

Co jest złego w dodaniu apostrofów po to url zakodowany? Lub, po prostu dodając je przed ręką w kodowaniu funkcji powyżej?

0

Właśnie natknąłem się na pewien kod robi to w ten sposób:

term = urllib.quote(term.join(("'", "'"))) 

(W tym przypadku join() wykorzystuje term jako separator, aby połączyć wszystkie elementy, które zostały podane w parametrze iterowalny w jeden ciąg. Ponieważ są tylko dwa elementy, są one po prostu zawijane wokół jednej instancji: term.)

Mimo że jest całkiem czytelna, nadal uważałbym ją za hakowanie i mniej czytelną niż inne opcje. Dlatego zalecam użycie formatowania ciągów, o którym wspominali inni:

term = urllib.quote("'{}'".format(term)) 
Powiązane problemy