Заменить переменную в одинарных кавычках в Python

Как заключить переменную в одинарные кавычки в python? Это, наверное, очень просто, но я не могу понять! Мне нужно URL-кодировать переменную term. term вводится в форме пользователем и передается функции, где он кодируется по URL term=urllib.quote(term). Если пользователь вводил "яблочный компьютер" в качестве своего термина, после URL-кодирования он будет "apple %20comptuer". Я хочу, чтобы этот термин был окружен одиночными кавычками перед кодировкой url, так что это будет "яблочный компьютер", а затем после URL-кодирования "% 23apple %20computer% 23". Мне нужно передать этот термин в URL-адрес, и он не будет работать, если я не использую этот синтаксис. Любые предложения?

Пример кода:

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

Ответ 1

Существует три способа:

  • конкатенация строк

    term = urllib.quote("'" + term + "'")
    
  • форматирование строк старого стиля

    term = urllib.quote("'%s'" % (term,))
    
  • форматирование строк в новом стиле

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

Ответ 2

Вы можете просто использовать интерполяцию строк:

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

Ответ 3

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

Должно быть то, что вы ищете.

Ответ 4

Что случилось с добавлением одинарных кавычек после кодирования url? Или, просто добавив их перед тем, как вы ввели функцию кодирования выше?

Ответ 5

Я просто наткнулся на какой-то код, делающий это так:

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

(В этом случае join() использует term как разделитель, чтобы объединить все элементы, которые были заданы в итерируемом параметре, в одну строку. Поскольку есть только два элемента, они просто обернуты вокруг одного экземпляра term.)

Хотя это вполне читаемо, я все равно считаю его взломанным и менее читаемым, чем другие варианты. Поэтому я рекомендую использовать форматирование строк, как упоминалось другими:

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

Ответ 6

Для тех, кто придет сюда, придумывая что-то вроде "струны окружения python" и время добросовестно (или просто ищет "лучшее" решение).

Я собирался добавить, что теперь есть f-строки, которые для среды Python 3. 6+ легче использовать, и из того, что я читаю, они говорят, что они быстрее.

#f-string approach
term = urllib.parse.quote(f"'{term}'")

Я решил сделать timeit каждого метода "окружения" строки в python.

import timeit

results = {}

results["concat"] = timeit.timeit("\"'\" + 'test' + \"'\"")
results["%s"] = timeit.timeit("\"'%s'\" % ('test',)")
results["format"] = timeit.timeit("\"'{}'\".format('test')")
results["f-string"] = timeit.timeit("f\"'{'test'}'\"") #must me using python 3.6+
results["join"] = timeit.timeit("'test'.join((\"'\", \"'\"))")

for n, t in sorted(results.items(), key = lambda nt: nt[1]):
    print(f"{n}, {t}")

Результаты:

concat, 0.009532792959362268
f-string, 0.08994143106974661
join, 0.11005984898656607
%s, 0.15808712202124298
format, 0.2698059631511569

Как ни странно, я получаю, что конкатенация выполняется быстрее, чем f-string, каждый раз, когда я запускаю ее, но вы можете копировать и вставлять, чтобы узнать, работает ли ваша строка/использование по-разному, также может быть лучший способ поместить их в timeit, чем \ избегая всех цитат, поэтому дайте мне знать