Я передаю аргумент функции, поэтому я хочу отложить предоставление параметра по умолчанию обычным способом:
def f(x = None):
if x == None:
x = ...
Единственная проблема заключается в том, что x, скорее всего, будет массивом numpy. Затем x == None возвращает логический массив, на который я не могу поставить условия. Компилятор предлагает использовать .any() или .all().
Но если я напишу
def f(x = None):
if (x == None).any():
x = ...
это не сработает, если x перейдет к своему значению по умолчанию, потому что тогда None == None является логическим, у которого нет методов .any() или .all(). Что я здесь делаю?






При сравнении с None рекомендуется использовать is вместо ==. Обычно это не имеет значения, но поскольку объекты могут реализовывать равенство любым способом, который они считают нужным, это не всегда надежный вариант.
К сожалению, это один из тех случаев, когда == его не сокращает, поскольку сравнение с множеством массивов возвращает логическую маску, основанную на условии. К счастью, в любой данной программе Python есть только один экземпляр None, поэтому мы можем фактически проверить идентичность объекта с помощью оператора is, чтобы выяснить, является ли он None или нет.
>>> None is None
True
>>> np.array([1,2,3]) is None
False
Таким образом, нет необходимости в any или all, вы можете обновить свою функцию примерно так:
def f(x=None):
if x is None:
print('None')
else:
print('Not none')
В действии:
>>> f()
None
>>> f(np.array([1,2,3]))
Not none