Одиничні цитати проти подвійних лапок в Python [закрито]


718

Згідно з документацією, вони в значній мірі взаємозамінні. Чи є стилістична причина використовувати одне над іншим?

Відповіді:


525

Мені подобається використовувати подвійні лапки навколо рядків, які використовуються для інтерполяції або є природними повідомленнями мови, та одинарні цитати для невеликих символьних рядків, але порушуватиму правила, якщо рядки містять лапки або якщо я забуду. Я використовую потрійні подвійні лапки для docstrings та необмежених рядкових літералів для регулярних виразів, навіть якщо вони не потрібні.

Наприклад:

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. Можливо, це щось стосується правил англійської цитати.
Майк А

12
Більшість кодерів python кодують саме так. Явного правила немає, але оскільки ми часто читаємо код таким чином, це стає звичкою.
e-satis

Цікаво, чи єдині лапки для символічних речей насправді походять від ярлика виразу цитати в Lisp / Scheme. У будь-якому випадку, це інтуїтивно. Крім того, мені товариші, якщо ми дотримуємося принципів стилю PEP 8, функції дійсно повинні бути названі lights_message () та is_pirate ().
yukondude

8
Я думаю, що Perl розмежував між рядками, що цитуються однаково (без інтерполяції), і рядками з подвійним котируванням (з інтерполяцією), і що кодери пітона, можливо, успадкували звичку або ніколи не відпускали її.
Дарен Томас

2
Я використовую ту саму умову, плюс я зловживаю нею, маючи vim виділити все, що знаходиться в потрійних одинарних лапках як SQL.
RoundTower

96

Цитуючи офіційні документи на веб- сайті https://docs.python.org/2.0/ref/strings.html :

Простий англійською мовою: Строкові літерали можуть бути укладені у відповідність одинарних лапок (') або подвійних лапок (").

Так що різниці немає. Натомість люди скажуть вам вибрати той стиль, який відповідає контексту, та бути послідовним . І я погодився б - додав, що безглуздо намагатися придумувати "умовності" для подібних речей, тому що ви лише заплутаєте будь-яких новачків.


3
так, для мене послідовність є ключовою, тому я просто використовую сингли всюди. Менше натискання клавіш, однозначне та послідовне.
mlissner

90

Я вважав за краще ', особливо для '''docstrings''', як я вважаю """this creates some fluff""". Також 'можна набрати без Shiftклавіші на моїй швейцарській німецькій клавіатурі.

З тих пір я перейшов на використання потрійних лапок """docstrings""", щоб відповідати PEP 257 .


2
Я, як правило, віддаю перевагу одинарним лапкам, оскільки я пишу SQL-код щодня, а одинарні лапки використовуються для рядкових літералів у T-SQL. Але я використовую потрійні подвійні лапки, тому що docstrings іноді можуть використовувати в них трохи пуху.
екзорцо

4
Використання скрізь простих лапок для рядків дозволяє мені відключити частини вихідного коду за допомогою трьох подвійних лапок - типу '#if 0' та '#endif'.
дим

12
"потрібна клавіша переключення лише на клавіатурі ПК QWERTY. На моїй клавіатурі "насправді простіше набрати.
e-satis

6
на моїй клавіатурі "і" обидва вимагають клавіші "Shift"
Loïc Faure-Lacroix

10
Ця відповідь суперечить умові пітона; див. PEP 257, де сказано: Для послідовності завжди використовуйте "" "потрійні подвійні лапки" "навколо навколо документа. python.org/dev/peps/pep-0257
Кнопки840

44

Я з Віллом:

  • Подвійні цитати тексту
  • Одиночні лапки для всього, що поводиться як ідентифікатор
  • Подвійне цитування вихідних рядкових літералів для регулярних виразів
  • Потрійні подвійні лапки для документації

Я буду дотримуватися цього, навіть якщо це означає багато втечі.

Я отримую найбільшу цінність з одного цитованих ідентифікаторів, які виділяються через цитати. Решта практик існують лише для того, щоб дати тим самим ідентифікованим ідентифікованим ідентифікаторам деяку кімнату.


26

Якщо рядок, який у вас є, містить один, то ви повинні використовувати інший. Наприклад "You're able to do this", або 'He said "Hi!"'. Крім цього, ви просто повинні бути настільки послідовними, наскільки це можливо (в рамках модуля, в пакеті, в рамках проекту, в організації).

Якщо ваш код читатимуть люди, які працюють з C / C ++ (або якщо ви переходите між цими мовами та Python), то використання ''для односимвольних рядків та ""довших рядків може полегшити перехід. (Так само для дотримання інших мов, де вони не взаємозамінні).

Код Python , я бачив в дикій природі , як правило , на користь "більш ', але тільки трохи. Єдиний виняток - """these"""це набагато частіше, ніж те '''these''', що я бачив.


21

Потрійні цитовані коментарі - цікава підтема цього питання. PEP 257 задає потрійні лапки для рядків doc . Я зробив швидку перевірку за допомогою Google Code Search і виявив, що потрійні подвійні лапки в Python приблизно в 10 разів настільки ж популярні, як потрійні одинарні лапки - 1,3 М проти 131 К випадків у індексах Google. Тож у багаторядковому випадку ваш код, мабуть, стане більш відомим людям, якщо він використовує потрійні подвійні лапки.


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

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

З цієї простої причини я завжди використовую подвійні лапки зовні. Завжди

Якщо говорити про пух, що корисного полягає в упорядкуванні ваших рядкових буквених знаків «якщо вам доведеться використовувати символи втечі, щоб представляти апострофи? Чи ображає кодерів читання романів? Я не уявляю, наскільки болючим для вас був клас середньої школи англійської мови!


11
"Якщо ви збираєтеся" процитувати "щось, вам неодмінно захочеться використовувати одинарні цитати"
Паоло,

Моя думка щодо цього сильно змінилася з моменту написання цього. Зараз це просто одна ситуація, коли я б стверджував, що буду використовувати подвійні лапки. Ще одна буде вашою в контексті використання одиничних цитат. Детальніше див . Прийняту відповідь на мою поточну позицію щодо цього питання. Я думаю, що це чудовий приклад того, як його слід представити широкій аудиторії.
Droogans

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

1
Вставте рядок між "цитатами" та "" "
Ніколя

1
@ dolma33 Пропозиція Ніколя змінила б зміст рядка. Краще рішення вже у відповіді: якщо ваш рядок закінчується якоюсь цитатою, використовуйте інший вид потрійної цитати. Наприклад, '''This is a string with "quotes"'''.
jpmc26

3

Я в основному використовую подвійні лапки, але не з якоїсь конкретної причини - Мабуть, просто за звичкою від Java.

Я думаю, ви також більше шанси на те, що вам захочеться апострофів у вбудованому прямому рядку, ніж ви хочете подвійних лапок.


3

Особисто я дотримуюсь того чи іншого. Це не має значення. І надавати власний сенс будь-якій цитаті - це просто заплутати інших людей при співпраці.


2

Це, мабуть, стилістичне уподобання більше ніж усе. Я щойно перевірив PEP 8 і не побачив жодної згадки про одиничні проти подвійних лапок.

Я віддаю перевагу одинарним цитатам, оскільки це лише один натискання клавіші замість двох. Тобто, мені не потрібно розминати клавішу shift, щоб зробити єдину цитату.


1
PEP 8 посилається на PEP 257 у першому реченні у розділі "Строки документації". У PEP 257 зазначено: Для послідовності завжди використовуйте "" "потрійні подвійні лапки" "навколо навколо документа. Використовуйте r "" "необроблені подвійні подвійні лапки" "", якщо ви використовуєте якісь зворотні косої риси у ваших документах. Для документів Unicode використовуйте u "" "рядки з потрійним цитуванням Unicode" "". Тим не менш, мені подобається чистий вигляд однієї цитати та одна причина натискання клавіш.
maxpolk

2

У Perl ви хочете використовувати одиничні лапки, коли у вас є рядок, який не потребує інтерполяції змінних чи символів, що увійшли, наприклад \ n, \ t, \ r тощо.

PHP робить те саме, що і Perl: вміст в одиничних лапках не буде інтерпретуватися (навіть \ n не буде перетворено), на відміну від подвійних лапок, які можуть містити змінні, щоб їх значення було роздруковано.

Пітон не боїться. Технічно видно, немає $-маркер (або подібного), щоб відокремити ім'я / текст від змінної в Python. Обидві функції роблять Python більш зрозумілим, менш заплутаним, зрештою. Одиничні та подвійні лапки можуть бути взаємозамінно використані в Python.


Щоб підкріпити те, що ви говорите, \ n буде інтерпретуватися лише у подвійних лапках у PHP та Perl, тоді як у Python працюватимуть як у подвійних, так і в одиночних лапках
stivlo

1
@stivlo: Якщо ви не зробите з нього необроблений рядок, додавши rперед ним буквальний рядок. Тож print 'a\nb'надрукуємо вам два рядки, але print r'a\nb'надрукуємо вам один.
Тадек


1

Я просто використовую те, що вражає мою фантазію в той час; зручно мати можливість перемикатися між цими двома примхами!

Зрозуміло, коли цитують цінаристів, перемикання між ними може бути не таким примхливим…


0

Смак вашої команди чи рекомендації щодо кодування вашого проекту.

Якщо ви перебуваєте в багатомовній обстановці, можливо, ви захочете заохочувати використання однотипних лапок для рядків, якими користується, наприклад, інша мова. Інше, мені особисто найбільше подобається зовнішній вигляд '


0

Ніхто, наскільки я знаю. Хоча якщо ви подивитесь на якийсь код, "" зазвичай використовується для рядків тексту (я думаю, "внутрішній текст є більш поширеним, ніж"), а "" з'являється в хеш-ключах тощо.


0

Я прагну мінімізувати як пікселі, так і здивувати. Я, як правило, віддаю перевагу ', щоб мінімізувати пікселі, але "замість цього, якщо рядок має апостроф, знову ж таки, щоб мінімізувати пікселі. Однак для докстрингу я віддаю перевагу """над '''тим, що останній нестандартний, нечастий і тому дивний. Якщо зараз у мене є купа струн, де я використовувався "відповідно до вищеописаної логіки, але також та, яка може піти з a ', я все одно можу використовувати "в ній збереження послідовності, тільки щоб мінімізувати здивування.

Можливо, це допомагає мислити філософію мінімізації пікселів наступним чином. Ви б хотіли, щоб англійські символи виглядали A B Cчи AA BB CC? Останній вибір витрачає 50% не порожніх пікселів.


-1

Я використовую подвійні лапки, тому що роблю це протягом багатьох років на більшості мов (C ++, Java, VB ...), крім Bash, тому що я також використовую подвійні лапки в звичайному тексті і тому, що я використовую (модифіковану) неанглійську клавіатуру, де обом символам потрібна клавіша 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")

Результати однакові

= >> ні, вони не однакові. Один зворотний косий рядок втече символів. Ви просто випадково пощастило в цьому прикладі , тому що \kі \wне є дійсними , як вислизає \tабо \nабо \\або\"

Якщо ви хочете використовувати одинарні косої риски (і інтерпретувати їх як такі), тоді вам потрібно використовувати "необроблений" рядок. Це можна зробити, поставивши " r" перед рядком

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

Що стосується доріжок у Windows, то прямі косої риси інтерпретуються однаково. Ясна річ сама по собі різниця. Я б не гарантував, що вони обробляються таким чином на зовнішньому пристрої.


Святе лайно це давнє, але я хотів прокоментувати все одно, щоб зазначити, що використання косої риски може працювати для Windows, але все ще залежить від системи. Щоб уникнути позбавлення від залежностей від ос, використовуйтеos.path.join()
Адам Сміт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.