在Python中用单引号括起变量

时间:2012-07-05 19:16:30

标签: python

如何在python中的单引号中包含变量?它可能很简单,但我似乎无法得到它!我需要对变量term进行url编码。用户在表单中输入Term,并将其传递给url编码的函数term=urllib.quote(term)。如果用户输入“apple computer”作为他们的术语,则在url-encoding之后它将是“apple%20comptuer”。我想要做的是在url编码之前使用单引号括起来的术语,以便在url-encoding“%23apple%20computer%23”之后它将是“'apple computer'”。我需要将该术语传递给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

6 个答案:

答案 0 :(得分:29)

有三种方式:

  1. 字符串连接

    term = urllib.quote("'" + term + "'")
    
  2. 旧式字符串格式

    term = urllib.quote("'%s'" % (term,))
    
  3. 新式字符串格式

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

答案 1 :(得分:9)

您可以使用字符串插值:

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

答案 2 :(得分:3)

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

应该是你想要的。

答案 3 :(得分:2)

在网址编码后添加单引号有什么问题?或者,只需将它们添加到您之前编码上面的函数?

答案 4 :(得分:1)

对于那些在谷歌上搜索诸如“ python环绕字符串”之类的东西的人,他们是出于时间考虑的(或者只是在寻找“最佳”解决方案)

我要补充的是,现在有f-strings,对于Python 3.6+环境,它更易于使用,并且据我所读,他们说它们更快。

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

我决定对python中“环绕”字符串的每种方法进行timeit处理。

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字符串,但是您可以复制并粘贴以查看您的字符串/用法是否以不同的方式工作,也许还有更好的方法将它们放入时间范围,而不是\转义所有引号,让我知道

答案 5 :(得分:0)

我只是偶然发现了一些代码:

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

(在这种情况下join()使用term作为分隔符将iterable参数中给出的所有元素组合成一个字符串。由于只有两个元素,它们只是围绕一个实例term。)

虽然它具有很强的可读性,但我仍然认为它是一种黑客攻击,而且比其他选项更不易读。因此,我建议使用其他人提到的字符串格式:

term = urllib.quote("'{}'".format(term))
相关问题