Безопасное разыменование в Python
Groovy имеет хороший оператор для безопасного разыменования, который помогает избежать NullPointerExceptions:
variable?.method()
на method
будет вызываться только, если variable
не null
.
есть ли способ сделать то же самое в Python? Или я должен написать if variable: variable.method()
?
4 ответов
нет, нет.
но проверить на
None
, ты не пишешьif x:
вы пишитеif x is None:
. Это важное различие ... --3--> значениеFalse
для довольно многих значений, которые являются вполне допустимыми (особенно 0-эквивалентные числа и пустые коллекции), тогда какx is None
только оценивает вTrue
если ссылкаx
указывает на объект-синглтонNone
.из личного опыта, такой оператор был бы необходим очень редко. Да,
None
иногда используется для указания значения нет. Но как-то-может быть, потому, что идиоматический код возвращает нулевые объекты где разумно или бросает исключения, чтобы указать критический сбой - я получаю толькоAttributeError: 'NoneType' object has no attribute '...'
два раза в месяц.я бы сказал, что это может быть несоответствие.
null
имеет два значения - "забыл инициализировать" и "никакие данные." Первый является ошибкой и должен выдавать исключение. Второй случай обычно требует более сложной обработки, чем "давайте просто не будем называть этот метод". Когда я спрашиваю базу данных / ORM дляUserProfile
, его там нет, и я получаю ... хочу ли я молча пропустить остальную часть метода? Или я действительно хочу (когда в "библиотечном коде") бросить исключение approriate (так что "пользователь (код)" знает, что пользователя нет и может реагировать... или игнорировать его) или (когда я кодирую конкретная функция) показать пользователю разумное сообщение ("Этот пользователь не существует, вы не можете добавить его в свой список друзей")?
Python не имеет такой вещи. Это потому, что нет null
указатель на Python. Ну, есть специальный None
значение, которое часто используется в ситуациях, когда оно представляет собой "нет значения". Но это всего лишь условность. None
значение/объект, как и все другие. А так как нет null
нет оператора, чтобы справиться с ней.
идиома, которую я видел и использовал, это callable(func) and func(a, b, c)
вместо простого вызова функции (где возвращаемое значение не используется). Однако, если вы пытаетесь использовать возвращаемое значение, эта идиома даст False
если функция не вызывается, что может быть не то, что вы хотите. В этом случае можно использовать тернарный оператор, чтобы указать значение по умолчанию. Например, если функция вернет список, который вы будете перебирать, вы можете использовать пустой список в качестве значения по умолчанию с func(a, b, c) if callable(func) else []
.
я использовал эту функцию в Groovy, поэтому я не буду повторять парадокс blub других плакатов.
в Groovy заявление, как это
if(possiblyNull?.value){
...
это в Python
try:
testVar = possiblyNull.value
except:
testVar = None
if(testVar):
это определенно классная функция в Groovy и полезна для удаления синтаксического шума. Есть несколько других бит синтаксического сахара, таких как оператор Элвиса или*, но они жертвуют удобочитаемостью в качестве расходов на символы быстрого исправления (другими словами, они не Pythonic).
надеюсь, что это поможет: -)