关于编码样式:python中的单引号与双引号

Single quotes vs. double quotes in Python

根据文档,它们几乎可以互换。有没有一个风格上的原因使用一个比另一个?


我喜欢在用于插值或自然语言消息的字符串周围使用双引号,对小型符号(如字符串)使用单引号,但如果字符串包含引号或我忘记了,则会破坏规则。我对docstring使用三重双引号,对正则表达式使用原始字符串文本,即使不需要它们。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
LIGHT_MESSAGES = {
    'English':"There are %(number_of_lights)s lights.",
    'Pirate': "Arr! Thar be %(number_of_lights)s lights."
}

def lights_message(language, number_of_lights):
   """Return a language-appropriate string reporting the light count."""
    return LIGHT_MESSAGES[language] % locals()

def is_pirate(message):
   """Return True if the given message sounds piratical."""
    return re.search(r"(?i)(arr|avast|yohoho)!", message) is not None


引用官方文档:https://docs.python.org/2.0/ref/strings.html:

In plain English: String literals can be enclosed in matching single quotes (') or double quotes (").

所以没有区别。相反,人们会告诉你选择与上下文匹配的样式,并保持一致。我也同意——补充说,尝试为这类事情提出"约定"是毫无意义的,因为你最终只会混淆任何新来者。


我以前更喜欢',特别是对于'''docstrings''',我发现"""this creates some fluff"""。另外,在我的瑞士-德国键盘上,不使用SHIFT键,也可以键入'

此后,我改为使用"""docstrings"""的三重报价,以符合PEP 257。


我和威尔在一起:

  • 文本双引号
  • 任何行为类似于标识符的事物的单引号
  • regexps的双引号原始字符串文本
  • 文档字符串的三重双引号

我会坚持的,即使这意味着要逃走很多。

我从单引号标识符中得到最大的值,这些标识符因引号而突出。剩下的练习只是给那些引用的标识符一些站立的空间。


如果您拥有的字符串包含一个,那么您应该使用另一个。例如,"You're able to do this"'He said"Hi!"'。除此之外,您应该尽可能保持一致(在模块内、在包内、在项目内、在组织内)。

如果你的代码将由C/C++的人阅读(或者如果你在这些语言和Python之间切换),那么对于单字符字符串使用EDCOX1(2),对于较长的字符串使用EDCOX1(3)可能有助于缓和转换。(同样适用于不可互换的其他语言)。

我在野外看到的python代码倾向于使用"而不是',但只是稍微有点。一个例外是,从我所见来看,"""these"""'''these'''更常见。


三重引用的评论是这个问题的一个有趣的副标题。PEP257为文档字符串指定了三个引号。我使用Google代码搜索进行了一次快速检查,发现python中的三重双引号大约是三重单引号的10倍——在代码google索引中出现了130万对131K。因此,在多行的情况下,如果代码使用三重双引号,那么它可能会更为人们所熟悉。


1
2
3
4
5
"If you're going to use apostrophes,
       ^

you'll definitely want to use double quotes"
.
   ^

出于这个简单的原因,我总是在外面使用双引号。总是

说到fluff,如果必须使用转义符来表示撇号,那么用'读小说会冒犯编码员吗?我无法想象高中英语课对你有多痛苦!


python使用类似这样的引号:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mystringliteral1="this is a string with 'quotes'"
mystringliteral2='this is a string with"quotes"'
mystringliteral3="""this is a string with"quotes" and more 'quotes'"""
mystringliteral4='''this is a string with 'quotes' and more"quotes"'''
mystringliteral5='this is a string with "quotes"'
mystringliteral6='this is a string with \042quotes\042'
mystringliteral6='this is a string with \047quotes\047'

print mystringliteral1
print mystringliteral2
print mystringliteral3
print mystringliteral4
print mystringliteral5
print mystringliteral6

其输出如下:

1
2
3
4
5
6
this is a string with 'quotes'
this is a string with"quotes"
this is a string with"quotes" and more 'quotes'
this is a string with 'quotes' and more"quotes"
this is a string with"quotes"
this is a string with 'quotes'


我一般使用双引号,但不是为了任何特定的原因——可能只是出于Java的习惯。

我想你也更可能希望在一个内联文字字符串中使用撇号,而不是双引号。


就我个人而言,我会坚持一个或另一个。没关系。并且为每一个引语提供你自己的意思只是在你合作的时候迷惑其他人。


这可能是一个更倾向于风格的选择。我刚查了一下Pep8,没有看到任何关于单引号和双引号的提及。

我喜欢单引号,因为它只有一个击键而不是两个。也就是说,我不必把shift键混搭成单引号。


In Perl you want to use single quotes when you have a string which doesn't need to interpolate variables or escaped characters like
, \t,
, etc.

php与perl有着相同的区别:单引号中的内容不会被解释(甚至也不会被转换),而双引号可以包含变量以打印其值。

恐怕Python不会。从技术上看,在python中,没有$token(或类似的)来分隔名称/文本和变量。毕竟,这两个特性使Python更具可读性,更不容易混淆。单引号和双引号在Python中可以互换使用。


我只是使用当时我喜欢的任何东西;一次冲动就能在两者之间切换是很方便的!

当然,当引用引用字符时,在两个字符之间切换可能并不是那么异想天开…


我选择使用双引号,因为它们更容易看到。


您的团队的品味或项目的编码准则。

如果您处于多语言环境中,您可能希望鼓励对其他语言使用的字符串使用相同类型的引号。否则,我个人最喜欢


我的目标是最小化像素和惊喜。我通常更喜欢'以最小化像素,但如果字符串有撇号,则"会再次最小化像素。然而,对于docstring,我更喜欢"""而不是''',因为后者是非标准的、不常见的,因此令人惊讶。如果现在我有一堆字符串,我按照上面的逻辑使用",但也可以使用',我仍然可以在其中使用",以保持一致性,只会尽量减少意外。

也许这有助于按照以下方式思考像素最小化的理念。您希望英文字符看起来像A B C还是AA BB CC?后一种选择会浪费非空像素的50%。


据我所知,没有。尽管您查看一些代码,""通常用于文本字符串(我猜"在文本内部比"),而""出现在哈希键和类似的东西中。


我使用双引号,因为我在大多数语言(C++、Java、VB……)中已经做了很多年了,除了BASH之外,因为我还在正常文本中使用双引号,因为我使用的是(修改的)非英语键盘,这两个字符都需要移位键。


'="

/=\=\\

例子:

1
2
3
4
f = open('c:\word.txt', 'r')
f = open("c:\word.txt","r")
f = open("c:/word.txt","r")
f = open("c:\\\word.txt","r")

结果是一样的

不,他们不一样。一个反斜杠将转义字符。在这个例子中,你碰巧遇到了运气,因为\k\w不是像\t
\\\"那样的有效逃犯。

如果您想使用单个反斜杠(并将其解释为这样),那么您需要使用一个"原始"字符串。你可以把"EDOCX1"(11)放在字符串前面

1
2
3
im_raw = r'c:\temp.txt'
non_raw = 'c:\\temp.txt'
another_way = 'c:/temp.txt'

就窗口中的路径而言,前斜杠的解释方式相同。显然,字符串本身是不同的。不过,我不能保证它们是在外部设备上以这种方式处理的。