'NoneType' nesnesi nedir?


89

Python betiğimi çalıştırdığımda şu hatayı alıyorum:

TypeError: cannot concatenate 'str' and 'NoneType' objects

'Str'nin dize anlamına geldiğinden oldukça eminim, ancak' NoneType 'nesnesinin ne olduğunu bilmiyorum. Betiğim ikinci satırda kayboluyor, ilkinin çalıştığını biliyorum çünkü bu satırdaki komutlar beklediğim gibi asa'mda. İlk başta send_command içinde değişkenler ve kullanıcı girişi kullandığım için olabileceğini düşündüm.

"CAPS" içindeki her şey değişkendir, "küçük harfli" her şey "parser.add_option" seçeneklerinden girilir.

Pexpect ve optparse kullanıyorum

send_command(child, SNMPGROUPCMD + group + V3PRIVCMD)
send_command(child, SNMPSRVUSRCMD + snmpuser + group + V3AUTHCMD + snmphmac + snmpauth + PRIVCMD + snmpencrypt + snmppriv)

2
Daha fazla kod ve girdi görmemiz gerekiyor - NoneTyoe, değişkenlerden birinin ayarlanmadığı anlamına gelir
mmmmmm

3
NoneTypesingleton değerinin türüdür None. Değerlerinizden biri dize değil.
Martijn Pieters

Hızlı ve Kirli: her terimi birleştirmek için str()str (SNMPSRVUSRCMD) + str (snmpuser) + ...
PeterMmm

2
@PeterMmm Bu berbat bir fikir - problem çizginin daha ilerisinde (belki daha da kötüsü) kendini gösterecek. Başlangıçta değişkenlerden birinin neden Yok olduğunu anlamak daha iyi olacaktır .
arshajii

Yanıtlar:


83

NoneTypeiçin türü Nonebelirten bir amacı, nesne, herhangi bir değer . None"hiçbir şey döndürmeyen" işlevlerin dönüş değeridir. Ayrıca, bir şeyi arayan ve bulabilen veya bulamayan işlevler için ortak bir varsayılan dönüş değeridir; örneğin, re.searchnormal ifade eşleşmediğinde veya dict.getanahtarın diktede girişi olmadığında döndürülür . NoneDizelere veya diğer nesnelere ekleme yapamazsınız .

Değişkenlerinizden biri Nonedize değil. Belki returnişlevlerinizden birini unuttunuz veya kullanıcı bir komut satırı seçeneği sağlamadı ve optparsesize Nonebu seçeneğin değerini vermiştir . Bir Nonedizeye eklemeye çalıştığınızda , bu istisnayı alırsınız:

send_command(child, SNMPGROUPCMD + group + V3PRIVCMD)

Bir groupya da SNMPGROUPCMDya da V3PRIVCMDvar Noneolan bir değer olarak.


Teşekkürler!! Doğru olduğunda, kullanıcı girişi seçeneklerimden biri nedense kabul etmiyordu. Bunu bir seçenek ve patlama olarak "isim" olarak ekledim, işe yaradı. Şimdi bunun neden bir seçenek olarak doğru şekilde kabul edilmediğini bulmam gerekiyor, diğer tüm seçenekler iyi çalışıyor.
güvensiz-IT

1
"Ayarlanmamış" biraz belirsizdir ... bir değişken tanımlanmamışsa ve onunla bir işlem yapmaya çalışırsanız, bir NameError. Aynı zamanda ayarlanabilir, ancak eşittir None("hiçbir şeye ayarlanmamış" = "ayarlanmamış"?), O zaman biraz elde edebilirsiniz TypeError.
Nick T

Temel olarak (buradaki C / Java üyeleri için) none = null
Zoe

24

NoneTypebasitçe Nonetekil türü :

>>> type(None)
<type 'NoneType'>

Yukarıdaki ikinci bağlantıdan:

None

Türün tek değeri NoneType. Nonevarsayılan bağımsız değişkenler bir işleve aktarılmadığında olduğu gibi, genellikle bir değerin yokluğunu temsil etmek için kullanılır. Atamalar Noneyasa dışıdır ve a SyntaxError.

Sizin durumunuzda, birleştirmeye çalıştığınız öğelerden biri gibi görünüyor None, dolayısıyla sizin hatanız.


21

Savunmaya yönelik programlama uğruna, nesneler kullanılmadan önce geçersizliğe karşı kontrol edilmelidir.

if obj is None:

veya

if obj is not None:

2
"eşittir" yalnızca ihtiyacınız olduğunda kullanılmalıdır. En iyi savunma programı testler, çok sayıda testtir.
Jürgen A. Erhard

2
Defansif programlama en kötü şeylerden biridir. Böyle bir hata bulursanız, bu, programlama hatası yaptığınız anlamına gelir. "Kullanmadan önce boş değeri kontrol etme" gibi şeyler yalnızca bazı ciddi hataları gizler. İstisnanın atılmasına izin vermelisiniz. Ve programcılara bazı özel istisnalar attırmayın, bu gerçekten külfetli. Doğal hatanın atılmasına izin verin. Aslında, savunma amaçlı programlama, başka bir dil kullanmanız gerektiğinin bir belirtisidir.
bzim

1
Veritabanını sqlAlchemy üzerinden sorguluyorum. Sonuç yok. Döndürülen nesne Yoktur. Sonuç yok demek. Hata yok. Bir sonucun yok olup olmadığını kontrol edersiniz, değilse sonuç nesnesini kullanırsınız. Bunda kötü bir şey yok. Programlamayla ilgili en kötü şey dogmatizmdir.
unity100

17

Bu, bir dizeyi bir şeyle birleştirmeye çalıştığınız anlamına gelir. None .

Hiçbiri Python'un "boş" değildir ve NoneType türüdür.

Bu kod aynı tür hatayı ortaya çıkaracaktır:

>>> bar = "something"
>>> foo = None
>>> print foo + bar
TypeError: cannot concatenate 'str' and 'NoneType' objects


2

Hata mesajında, size iki nesneyi değerlerini göstererek (bir dize ve Nonebu örnekte) birleştiremeyeceğinizi söylemek yerine , Python yorumlayıcısı, birleştirmeye çalıştığınız nesnelerin türlerini göstererek bunu size söyler. Her dizenin strtürü, tek bir Noneörneğin türü çağrılırken olur NoneType.

Normalde endişelenmenize gerek yoktur NoneType, ancak bu örnekte bunu bilmeniz gerekir type(None) == NoneType.


Çok benzer bir sorunum var ve nesnenin >>> type(key) <type 'NoneType'> >>> type(key) == NoneType Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'NoneType' is not defined
NoneType

2
@RuBiCK NoneTypehiçbir yerde tanımlanmadı (bildiğim kadarıyla). Bir değer olup olmadığını kontrol etmek istiyorsanız None, sadece kullanın key is None(bkz. Stackoverflow.com/questions/23086383/… ). Aksi takdirde type(key) == type(None)aynı etkiyi kullanabilirsiniz.
Feuermurmel

1

Hatanız aşağıdaki gibi bir sebepten kaynaklanıyor:
>>> None + "hello world"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'NoneType' and 'str'
>>>

Python'un Hiçbiri nesnesi, diğer dillerde kabaca null , nil , vb. İle eşdeğerdir .


0

Değişkenlerden birine herhangi bir değer verilmemiştir, dolayısıyla bu bir NoneType'dır. Bunun neden olduğuna bakmanız gerekecek, muhtemelen sizin açınızdan basit bir mantık hatasıdır.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.