Pythonでの単一引用符と二重引用符の比較[終了]


718

ドキュメントによると、それらはほとんど交換可能です。どちらを使用するかという文体上の理由はありますか?

回答:


525

補間に使用される文字列または自然言語メッセージである文字列を二重引用符で囲み、小さな記号のような文字列を単一引用符で囲みますが、文字列に引用符が含まれている場合、または忘れた場合は規則に違反します。docstringには三重二重引用符を使用し、正規表現には不要な場合でも生の文字列リテラルを使用します。

例えば:

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

4
興味深いことに、私はそれらをまったく同じ方法で使用します。その方向に私を少しずつ動かすために何かを読んだ覚えはありません。また、生のhtmlのように、人間向けではない長い文字列には三重一重引用符を使用します。多分それは英語の引用ルールと関係があるのでしょう。
マイクA

12
ほとんどのpythonコーダーはそのようにコード化します。明確なルールはありませんが、コードをそのように読むことが多いため、習慣になっています。
e-satis 2010年

シンボルのようなものの一重引用符は、実際にはLisp / Schemeの引用式のショートカットから来ているのでしょうか。いずれにせよ、それは直感的です。また、私は仲間ですが、PEP 8スタイルのガイドラインに従っている場合、関数は実際にはlights_message()およびis_pirate()という名前にする必要があります。
yukondude

8
Perlは一重引用符付きの文字列(補間なし)と二重引用符付きの文字列(補間あり)を区別していたと思います。そのため、Pythonのコーダーはこの習慣を継承しているか、それを手放さなかったのでしょう。
ダレントーマス

2
私は同じ規則を使用していますが、vimでSQLとして三重単一引用符内のすべてを強調表示することで悪用しています。
RoundTower 2012年

96

https://docs.python.org/2.0/ref/strings.htmlの公式ドキュメントを引用:

平易な英語の場合:文字列リテラルは、一致する一重引用符( ')または二重引用符( ")で囲むことができます。

したがって、違いはありません。代わりに、コンテキストに一致するスタイルを選択し、一貫性を保つように指示されます。そして、私は同意します。つまり、この種のことについて「慣習」を考え出そうとするのは無意味であり、新規参入者を混乱させるだけだからです。


3
ええ、私にとっては一貫性が重要なので、どこでもシングルを使用します。キー操作が少なく、明確で一貫しています。
mlissner 2011

90

私が見つけたように、私'は特に、のために好んで使用しました。また、スイスのドイツ語キーボードのキーなしでも入力できます。'''docstrings'''"""this creates some fluff"""'Shift

その後"""docstrings"""PEP 257に準拠するために、に三重引用符を使用するように変更しました。


2
私は毎日SQLコードを記述し、T-SQLの文字列リテラルには単一引用符を使用するため、私は単一引用符を好む傾向があります。しかし、私は三重の二重引用符を使用しています。なぜなら、docstringは、それらの中で多少の綿毛を使用することができるからです。
eksortso 2010年

4
文字列にどこでもシンプルな引用符を使用すると、「#if 0」と「#endif」のような3つの二重引用符を使用してソースコードの一部を無効にできます。
薄暗い

12
"PC QWERTYキーボードでのみShiftキーが必要です。私のキーボードで"は、実際に入力する方が簡単です。
e-satis、2011年

6
私のキーボードに "と 'の両方にシフトキーが必要です。
-Lacroix

10
この答えはpythonの規則に反しています。PEP 257を参照してください:一貫性を保つため、docstringの周りには常に "" "triple double quotes" ""を使用してください。 python.org/dev/peps/pep-0257
Buttons840

44

私はウィルと一緒です:

  • テキストの二重引用符
  • 識別子のように動作するものはすべて単一引用符
  • 正規表現の二重引用符で囲まれた未加工文字列リテラル
  • docstringの三重の二重引用符

それは、多くの脱出を意味するとしても、私はそれに固執します。

一重引用符で囲まれた識別子が最も優れているのは、引用符があるからです。残りのプラクティスは、一重引用符で囲まれた識別子に立ち見を与えるためだけにあります。


26

あなたが持っている文字列に一方が含まれている場合は、もう一方を使用する必要があります。たとえば、、"You're able to do this"または'He said "Hi!"'。それ以外は、できる限り一貫している必要があります(モジュール内、パッケージ内、プロジェクト内、組織内)。

C / C ++を使用する人がコードを読み取る場合(または、それらの言語とPythonを切り替える場合)、''単一文字の文字列に使用し、""長い文字列に使用すると、移行が容易になります。(同様に、互換性がない他の言語についても同様です)。

私が実際に目にしたPythonコードはに"勝る傾向があり'ますが、ほんの少しです。唯一の例外は、私が見たものから、"""these"""より一般的です'''these'''


21

三重引用符で囲まれたコメントは、この質問の興味深いサブトピックです。PEP 257は、ドキュメント文字列の三重引用符を指定しています。私はGoogleコード検索を使用して簡単なチェックを行ったところ、Pythonの三重二重引用符は三重単一引用符の約10倍の人気があることがわかりました。そのため、複数行の場合、コードがトリプルダブルクォートを使用する場合、コードはおそらくより親しみやすくなります。


13
"If you're going to use apostrophes, 
       ^

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

その単純な理由から、私は常に外側に二重引用符を使用しています。常に

綿毛といえば、アポストロフィを表すためにエスケープ文字を使用する必要がある場合、文字列リテラルを 'で効率化するとどのようなメリットがありますか?小説を読むことはプログラマーを怒らせますか?高校の英語の授業があなたにとってどれほど辛かったか、想像もつきません!


11
「何かを「引用」する場合は、必ず単一引用符を使用する必要があります」
Paolo

私がこれを書いて以来、私の意見はこれについて大きく変わりました。これは、二重引用符を使用すると主張する状況の1つにすぎません。もう1つは、一重引用符を使用する場合のものです。問題についての私の現在のスタンスについては、受け入れられた回答を詳細に参照してください。これは、幅広い視聴者にどのように提示すべきかを示す良い例だと思います。
Droogans 2013

7

Pythonは次のような引用符を使用します。

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

次の出力が得られます。

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'

2
ただし"""This is a string with "quotes""""、SyntaxErrorが発生します。この状況をどのように解決できますか?(と同じ'''This is a string with 'quotes''''
dolma33 2012年

1
"quotes"と "" "の間に改行を挿入する
Nicolas

1
@ dolma33 Nicolasの提案は、文字列の内容を変更します。より良い解決策はすでに答えにあります:文字列がある種の引用符で終わっている場合は、他の種類の三重引用符を使用してください。例えば、'''This is a string with "quotes"'''
jpmc26 2014年

3

私は一般的に二重引用符を使用しますが、特定の理由ではありません-おそらくJavaの習慣から外れているだけでしょう。

インラインリテラル文字列でアポストロフィを使用することも、二重引用符を使用することよりも可能性が高いと思います。


3

個人的にはどちらかにこだわっています。それは問題ではありません。そして、どちらかの引用にあなた自身の意味を与えることは、あなたが共同作業するときに他の人々を混乱させることです。


2

それはおそらく何よりもスタイルの好みです。私はPEP 8をチェックしたところ、一重引用符と二重引用符についての言及がありませんでした。

単一引用符の方が2つではなく1つのキーストロークなので、私はそれを優先します。つまり、単一引用符を付けるためにShiftキーをマッシュする必要はありません。


1
PEP 8は、「Documentation Strings」の下の最初の文のPEP 257にリンクしています。PEP 257には、次のように記載されています。ドキュメント文字列でバックスラッシュを使用する場合は、r "" "rawトリプルダブルクォート" ""を使用します。Unicode docstringの場合は、u "" "Unicodeの三重引用符付き文字列" ""を使用します。それでも、私は一重引用符の見た目がきれいで、キーストロークの理由の1つをあなたが与えたのが好きです。
maxpolk 2013

2

Perlでは、変数または\ n、\ t、\ rなどのエスケープ文字を補間する必要のない文字列がある場合は、単一引用符を使用します。

PHPはPerlと同じ区別をします。値を出力するために変数を含めることができる二重引用符とは対照的に、単一引用符のコンテンツは解釈されません(\ nも変換されません)。

Pythonはそうではありません、私は恐れています。技術的には、Pythonで名前/テキストを変数から分離するための$トークン(など)はありません。結局のところ、どちらの機能もPythonを読みやすくし、混乱を少なくします。Pythonでは、一重引用符と二重引用符を同じ意味で使用できます。


あなたが言うことを補強するために、\ nはPHPとPerlでは二重引用符でのみ解釈されますが、Pythonでは二重引用符と単一引用符の両方で機能します
stivlo

1
@stivlo:r文字列リテラルの前に追加して、そこから生の文字列を作成する場合を除きます。したがってprint 'a\nb'、2行印刷されますが、1行print r'a\nb'印刷されます。
-Tadeck


1

当時は自分の好きなものを何でも使っています。ふたりで気まぐれに切り替えられると便利!

もちろん、引用文字を引用するとき、2つを切り替えるのは結局それほど風変わりではないかもしれません...


0

チームの好みまたはプロジェクトのコーディングガイドライン。

多言語環境にいる場合は、たとえば、他の言語が使用するのと同じタイプの引用符を文字列に使用することをお勧めします。さもなければ、私は個人的に一番の見た目が好きです


0

私の知る限りではありません。ただし、コードを見ると、テキストの文字列には「」が一般的に使用されています(「」は「」よりも「テキスト」の内部でより一般的だと思います)。


0

ピクセルと驚きの両方を最小限に抑えることを目指しています。私は通常'、ピクセルを最小化するために好み"ますが、代わりに文字列にアポストロフィがある場合は、ピクセルを最小化します。ただし、docstringの場合、後者は非標準であり、一般的ではないため、意外なので、優先さ"""'''ます。"上記のロジックに従って使用した一連の文字列があり、さらにで回避できる文字列がある'場合でも、"、驚きを最小限に抑えるために、一貫性を維持にその。

おそらくそれは、次のようにピクセル最小化の哲学を考えるのに役立ちます。英語の文字が似ていると思いますA B CAA BB CC?後者を選択すると、空でないピクセルの50%が無駄になります。


-1

Bashを除くほとんどの言語(C ++、Java、VBなど)で何年も使用しているため、二重引用符を使用しています。どちらの文字にもShiftキーが必要です。


-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")

結果は同じです

= >>いいえ、それらは同じではありません。単一のバックスラッシュは文字をエスケープします。\kand やorの\wような有効なエスケープではないため、この例ではたまたま幸運なことに\t\n\\または\"

単一のバックスラッシュを使用したい(そしてそれらをそのように解釈させたい)場合は、「生の」文字列を使用する必要があります。r文字列の前に' 'を置くことでこれを行うことができます

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

Windowsのパスに関する限り、スラッシュは同じように解釈されます。明らかに、文字列自体は異なります。ただし、外部デバイスでこのように処理されることは保証できません。


これは古くからありますが、とにかくコメントを付けて、スラッシュの使用はWindowsでも機能するが、システムに依存していることを指摘しておきます。OSの依存関係を排除するには、次を使用しますos.path.join()
Adam Smith
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.