Безопасная разыменование в Python - PullRequest
11 голосов
/ 01 ноября 2010

В Groovy есть хороший оператор для безопасного разыменования, который помогает избежать исключений NullPointerException:

variable?.method()

method будет вызываться, только если variable не null.

Есть ли способ сделать то же самое в Python? Или я должен написать if variable: variable.method()?

Ответы [ 4 ]

10 голосов
/ 01 ноября 2010
  1. Нет, нет.

  2. Но для проверки None вы не пишете if x:, вы пишете if x is None:. Это важное различие - x оценивается в False для довольно многих значений, которые являются вполне допустимыми (в основном 0-эквивалентные числа и пустые коллекции), тогда как x is None только оценивается в True если ссылка x указывает на одноэлементный объект None.

  3. Исходя из личного опыта, такой оператор понадобился бы очень редко. Да, None иногда используется для указания значения. Но каким-то образом - возможно, потому что идиоматический код возвращает нулевые объекты , где это разумно, или выдает исключения, указывающие на критическую ошибку - я получаю AttributeError: 'NoneType' object has no attribute '...' только два раза в месяц.

  4. Я бы сказал, что это может быть ошибкой. null имеет два значения - «забыли инициализировать» и «нет данных». Первый является ошибкой и должен выдать исключение . Второй случай обычно требует более сложной обработки, чем «давайте просто не будем вызывать этот метод». Когда я спрашиваю у базы данных / ORM UserProfile, его там нет, и вместо этого я получаю null ... хочу ли я молча пропустить оставшуюся часть метода? Или я действительно хочу (когда в «коде библиотеки») генерировать исключение approriate (чтобы «пользователь (код)» знал, что пользователя там нет и может реагировать ... или игнорировать его) или (когда я кодирование определенной функции) показать разумное сообщение («Этот пользователь не существует, вы не можете добавить его в свой список друзей») для пользователя?

4 голосов
/ 10 декабря 2010

Я использовал эту функцию в Groovy, поэтому я не буду повторять парадокс слюны других постеров.

В Groovy такое утверждение

if(possiblyNull?.value){
    ...

делает это в Python

try:
    testVar = possiblyNull.value
except:
    testVar = None
if(testVar): 

Это определенно классная функция в Groovy, которая помогает удалить синтаксический шум.Есть несколько других кусочков синтаксического сахара, таких как оператор Элвиса или *, но они жертвуют удобочитаемостью как расходом на символы быстрого исправления (другими словами, они не являются пифоническими). ​​

Надежда, которая помогает: -)

2 голосов
/ 01 ноября 2010

Идиома, которую я видел и использовал, это callable(func) and func(a, b, c) вместо простого вызова функции (где возвращаемое значение не используется).Однако если вы пытаетесь использовать возвращаемое значение, эта идиома выдаст False, если функция не вызывается, что может быть не тем, что вы хотите.В этом случае вы можете использовать троичный оператор для предоставления значения по умолчанию.Например, если функция вернет список, по которому вы будете повторяться, вы можете использовать пустой список в качестве значения по умолчанию с func(a, b, c) if callable(func) else [].

1 голос
/ 01 ноября 2010

Python не имеет такой вещи.Это потому, что в Python нет указателя null.Ну, есть специальное значение None, которое часто используется в ситуациях, когда оно представляет «нет значения».Но это просто соглашение.None это значение / объект, как и все остальные.А поскольку нет null, то нет оператора, который мог бы с ним справиться.

...