Это означает, что указанная переменная не указана ни на что. Я мог бы сгенерировать это так:
SqlConnection connection = null;
connection.Open();
Это вызовет ошибку, потому что, пока я объявил переменную «connection
», она не указала ни на что. Когда я пытаюсь вызвать член «Open
», для его устранения нет ссылки, и он будет вызывать ошибку.
Чтобы избежать этой ошибки:
object == null
. Инструмент Resharper JetBrains определит каждое место в вашем коде, которое имеет возможность ошибки нулевой ссылки, позволяя вам ввести нулевую проверку. Эта ошибка является источником ошибок номер один, IMHO.
Существует значительная проблема с некоторыми из ответов, опубликованных до сих пор: unicode()
декодирует кодировку по умолчанию, которая часто является ASCII; на самом деле, unicode()
пытается сделать «смысл» байтов, которые он задает, преобразуя их в символы. Таким образом, следующий код, который по сути является тем, что рекомендуется в предыдущих ответах, не работает на моей машине:
# -*- coding: utf-8 -*-
author = 'éric'
print '{0}'.format(unicode(author))
дает:
Traceback (most recent call last):
File "test.py", line 3, in <module>
print '{0}'.format(unicode(author))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)
Ошибка возникает из-за того, что author
не содержит только ASCII-байты (т. е. со значениями в [0; 127]), а unicode()
по умолчанию декодирует из ASCII (на многих машинах).
Надежное решение должно явно указывать кодировка, используемая в ваших полях; взяв UTF-8 в качестве примера:
u'{0} in {1}'.format(unicode(self.author, 'utf-8'), unicode(self.publication, 'utf-8'))
(или без начального u
, в зависимости от того, хотите ли вы результат Unicode или байтовую строку).
При этом то можно подумать о том, что поля author
и publication
являются строками Unicode, а не декодировать их во время форматирования.
Для python2 вы также можете сделать это
'%(author)s in %(publication)s'%{'author':unicode(self.author),
'publication':unicode(self.publication)}
, что удобно, если у вас есть много аргументов для замены (особенно если вы делаете интернационализацию)
Python2.6 вперед поддерживает .format()
'{author} in {publication}'.format(author=self.author,
publication=self.publication)
Вы также можете использовать его чистым и простым (но не так, потому что вы должны использовать format
, как сказал Марк Байерс), выполнив:
print 'This is my %s formatted with %d arguments' % ('string', 2)
Если вы используете несколько аргументов, это должно быть в кортеже (обратите внимание на дополнительные скобки):
'%s in %s' % (unicode(self.author), unicode(self.publication))
Как указывает EOL, функция unicode()
обычно принимает ascii-кодирование по умолчанию, поэтому, если у вас есть символы, отличные от ASCII, безопаснее явно передавать кодировку:
'%s in %s' % (unicode(self.author,'utf-8'), unicode(self.publication('utf-8')))
. А с Python 3.0 предпочтительнее использовать str.format()
вместо:
'{0} in {1}'.format(unicode(self.author,'utf-8'),unicode(self.publication,'utf-8'))
'{} in {}'
.
– Cristian Ciupitu
31 May 2015 в 08:11
format
Ниже приведена отрывок из документации:
Учитывая спецификации
format % values
,%
вformat
заменены на ноль или более элементов изvalues
. Эффект похож на использованиеsprintf()
в языке C.Если для
format
требуется один аргумент, значения могут быть одиночными объектами без кортежей. В противном случае значения должны быть кортежем с точно количеством элементов, заданных строкойformat
, или единственным объектом сопоставления (например, словарем).Ссылки
На
str.format
вместо%
Более новой альтернативой оператору
%
является использованиеstr.format
. Вот выдержка из документации:
str.format(*args, **kwargs)
Выполнить операцию форматирования строк. Строка, на которой вызывается этот метод, может содержать литеральный текст или поля замещения, разделенные фигурными скобками
{}
. Каждое поле замены содержит либо числовой индекс позиционного аргумента, либо имя аргумента ключевого слова. Возвращает копию строки, где каждое замещающее поле заменяется строковым значением соответствующего аргумента.Этот метод является новым стандартом в Python 3.0 и должен быть предпочтительнее форматирования
%
.Ссылки
Примеры
Вот некоторые примеры использования:
>>> '%s for %s' % ("tit", "tat") tit for tat >>> '{} and {}'.format("chicken", "waffles") chicken and waffles >>> '%(last)s, %(first)s %(last)s' % {'first': "James", 'last': "Bond"} Bond, James Bond >>> '{last}, {first} {last}'.format(first="James", last="Bond") Bond, James Bond
См. также
'{self.author} in {self.publication}'.format(self=self)
должно «работать». Я просто не уверен в целом unicode
.
– polygenelubricants
3 August 2010 в 11:08
{first[0]}
для получения начального J
.
– Duncan
3 August 2010 в 13:43
Вы должны просто поместить значения в круглые скобки:
'%s in %s' % (unicode(self.author), unicode(self.publication))
Здесь для первого %s
будет помещен unicode(self.author)
. И для второго %s
будет использоваться unicode(self.publication)
.
Примечание. Вы должны
blockquote>string formatting
использовать%
Notation. Подробнее здесь
%s
, а не format
– user1767754
16 January 2018 в 01:09