Безопасное разыменование в Python

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

variable?.method()

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

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

4 ответов


  1. нет, нет.

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

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

  4. я бы сказал, что это может быть несоответствие. 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).

надеюсь, что это поможет: -)