Mam metodę, która czasami zwraca wartość NoneType. Jak mogę zakwestionować zmienną, która jest typu NoneType? Na przykład muszę użyć metody if
if not new:
new = '#'
Wiem, że to zły sposób i mam nadzieję, że rozumiesz, co miałem na myśli.
Mam metodę, która czasami zwraca wartość NoneType. Jak mogę zakwestionować zmienną, która jest typu NoneType? Na przykład muszę użyć metody if
if not new:
new = '#'
Wiem, że to zły sposób i mam nadzieję, że rozumiesz, co miałem na myśli.
Odpowiedzi:
Jak mogę zakwestionować zmienną, która jest typu NoneType?
Użyj is
operatora, tak jak to
if variable is None:
Dlaczego to działa?
Ponieważ None
jest to jedyny obiekt typu singleton NoneType
w Pythonie, możemy użyć is
operatora do sprawdzenia, czy zmienna ma None
w sobie czy nie.
Cytując z is
dokumentów ,
Operatorzy
is
iis not
testy do identyfikacji obiektu:x is y
jest prawdziwe wtedy i tylko wtedyx
, ay
to ten sam obiekt.x is not y
daje odwrotną wartość prawdy.
Ponieważ może istnieć tylko jedna instancja None
, is
byłby to preferowany sposób sprawdzenia None
.
Usłysz to z pyska konia
Cytując Wytyczne dotyczące stylu kodowania Pythona - PEP-008 (wspólnie zdefiniowane przez samego Guido),
Porównania do pojedynczych lubię
None
zawsze powinny być wykonane zis
lubis not
, nigdy operatorów równości .
== None
i is None
?
None
, oba przyniosą podobny wynik.
pandas
DataFrame istnieje - w tym type(df) is type(None)
celu The truth value of a DataFrame is ambiguous
Można to również zrobić isinstance
zgodnie z odpowiedzią Alexa Halla :
>>> NoneType = type(None)
>>> x = None
>>> type(x) == NoneType
True
>>> isinstance(x, NoneType)
True
isinstance
jest również intuicyjny, ale istnieje komplikacja, że wymaga linii
NoneType = type(None)
co nie jest potrzebne dla typów takich jak int
i float
.
NoneType
a ponieważ None
jest to singleton, isinstance
nie należy go używać do wykrywania None
- zamiast tego należy postępować zgodnie z przyjętą odpowiedzią i użyć is None
lub is not None
.
Jak zauważył komentarz Aarona Halla:
Ponieważ nie można podklasować,
NoneType
a ponieważNone
jest to singleton,isinstance
nie należy go używać do wykrywaniaNone
- zamiast tego należy postępować zgodnie z przyjętą odpowiedzią i użyćis None
lubis not None
.
Oryginalna odpowiedź:
Najprostszym sposobem jednak bez dodatkowej linii oprócz odpowiedzi na kardamon jest prawdopodobnie:
isinstance(x, type(None))
Jak mogę zakwestionować zmienną, która jest typu NoneType? Muszę użyć metody if
Używanie isinstance()
nie wymaga is
wewnątrz if
-statement:
if isinstance(x, type(None)):
#do stuff
Informacje dodatkowe
Można również sprawdzić, czy w jednym isinstance()
wyciągu jest wiele typów, jak wspomniano w dokumentacji . Po prostu napisz typy jako krotkę.
isinstance(x, (type(None), bytes))
NoneType
a ponieważ None
jest to singleton, isinstance
nie należy go używać do wykrywania None
- zamiast tego należy postępować zgodnie z przyjętą odpowiedzią i użyć is None
lub is not None
.
python 3.6.7
isinstance
nie należy używać? Rozumiem, że is
należy to preferować, ale są przypadki, w których formularz isinstance wydaje się bardziej naturalny (np. Sprawdzanie wielu typów jednocześnie isinstance(x, (str, bool, int, type(None)))
). Czy to tylko osobiste preferencje, czy jest jakieś zastrzeżenie, którego nie jestem świadomy?
type
2., a następnie wywołanie go 3. następnie wyszukiwanie typu None
- kiedy None
jest singletonem i słowem kluczowym. Kolejny minus: 4. jest to bardzo niestandardowe i podniesie brwi, gdy ludzie patrzą na twój kod. x is None
jest bardziej zoptymalizowanym czekiem. Sugerowałbym x is None or isinstance(x, (str, bool, int))
- ale sugerowałbym również, abyś pomyślał więcej o tym, co robisz, gdy robisz tego rodzaju sprawdzanie typów, które nie mają ze sobą wiele wspólnego ...
Nie jestem pewien, czy to odpowiada na pytanie. Ale wiem, że zrozumienie tego zajęło mi trochę czasu. Przeglądałem stronę internetową i nagle nie było już nazwiska autorów. Potrzebowałem więc wyciągu z czeku.
if type(author) == type(None):
my if body
else:
my else body
Autor może być dowolną zmienną w tym przypadku i None
może być dowolnego typu, którego szukasz.
None
jest to singleton, type
nie należy go używać do wykrywania None
- zamiast tego należy postępować zgodnie z przyjętą odpowiedzią i użyć is None
lub is not None
.
Python 2.7:
x = None
isinstance(x, type(None))
lub
isinstance(None, type(None))
==> Prawda
NoneType
a ponieważ None
jest to singleton, isinstance
nie należy go używać do wykrywania None
- zamiast tego należy postępować zgodnie z przyjętą odpowiedzią i użyć is None
lub is not None
.
Mam nadzieję, że ten przykład będzie dla ciebie pomocny)
print(type(None) # NoneType
Możesz więc sprawdzić typ nazwy zmiennej
#Example
name = 12 # name = None
if type(name) != type(None):
print(name)
else:
print("Can't find name")