Установить пересечение с None - PullRequest
0 голосов
/ 29 августа 2018

У меня проблемы с пересечением заданной операции.

Предположим, у меня есть список A = [0,1,2,3] и целое число B = 0. Когда я проверяю if B in A:, я, конечно, получаю True.

Но когда A и B по умолчанию равны None, тогда я не могу выполнить операцию пересечения A и B.

Я ищу способ выполнить следующие действия без получения ошибки:

A = None
B = None

if B in A:
    raise KeyError('B in A')

Обычно A - это список Python, а B - строка. Но мне нужно установить их на None по умолчанию, пока они являются аргументами в моей функции; где они должны иметь значение None.

PS: получение True или False с поисковым алгоритмом. не важно. Мне просто нужно получить True или False, чтобы я мог организовать сбор ошибок.

Ответы [ 6 ]

0 голосов
/ 29 августа 2018

Продолжайте использовать None в качестве аргумента по умолчанию, а затем просто установите a в качестве пустого набора set, если это None (я использую имена аргументов в нижнем регистре в соответствии с соглашением Python):

def f(a=None, b=None):
   if a is None:
       a = set()

    if b in a:
        raise KeyError('b in a')

    if a.isdisjoint(other_set):
       ...
0 голосов
/ 29 августа 2018

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

from typing import List, Optional

def check_intersect(A: Optional[List[str]] = None, B: Optional[str] = None):
    if A is None:
        A = []
    if B in A:  # this can't fail any more 
        raise KeyError('B in A')

Ключевое слово in (если оно, конечно, не является частью цикла for ..) требует в качестве аргумента правой стороны объект python, который предлагает функцию __contains__(), которая None нет.

0 голосов
/ 29 августа 2018

вы можете попробовать:

if B in (A or []):

, поэтому, если A равно None, оно проверяет пустой список и выдает False

, если A - пустой список, он также проверяет самый правый операнд or, но результат будет таким же.

Увеличенная область: если в вашей функции по умолчанию установлены значения None:

def foo(A=None,B=None):

оставьте их как None и измените их в коде функции, чтобы аргумент по умолчанию не был изменяемым ( "Наименьшее изумление" и изменяемый аргумент по умолчанию ).

if A is None:
   A = []
0 голосов
/ 29 августа 2018

Проще всего было бы установить A = [] вместо A = None (это разумное значение для того, что в конечном итоге будет списком).

Если A является аргументом вашей функции, будьте осторожны, вы не пишете

def f(A=[])

но вместо

def f(A=None):
    if A is None:
       A = []
0 голосов
/ 29 августа 2018
A = [None, 1, 2]
B = None

if B in A: # where A should be a list, it should be iterable
    print('done')

выход

done
0 голосов
/ 29 августа 2018

Почему бы не попытаться проверить, является ли A или B самим None?

A = None
B = None

if None not in [A, B] and B in A:
    print('B in A')
else:
    print('B or A is None, or B is not in A')
...