'NoneType'オブジェクトとは何ですか?


89

Pythonスクリプトを実行すると、次のエラーが発生します。

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

'str'は文字列を意味すると確信していますが、 'NoneType'オブジェクトが何であるかはわかりません。私のスクリプトは2行目でクラップスになっています。最初の行のコマンドは期待どおりに私のasaにあるので、最初のスクリプトが機能することはわかっています。最初は、send_command内で変数とユーザー入力を使用しているためかもしれないと思いました。

「CAPS」のすべてが変数であり、「小文字」のすべてが「parser.add_option」オプションから入力されます。

私はpexpectとoptparseを使用しています

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

2
より多くのコードと入力を確認する必要があります-NoneTyoeは、変数の1つが設定されていないことを意味します
mmmmmm 2014年

3
NoneTypeシングルトン値のタイプですNone。値の1つが文字列ではありません。
MartijnPieters

Quick&Dirty:各用語を連結してstr()str(SNMPSRVUSRCMD)+ str(snmpuser)+ ...
PeterMmm 2014年

2
@PeterMmmそれはひどい考えです-問題は、さらに先に(おそらくもっと悪いことに)明らかになるでしょう。そもそも、変数の1つがNoneである理由を理解することをお勧めします。
arshajii 2014年

回答:


84

NoneTypeNoneオブジェクトのタイプであり、ないことを示すオブジェクトですNone「何も返さない」関数の戻り値です。これは、何かを検索し、それを見つける場合と見つけない場合がある関数の一般的なデフォルトの戻り値でもあります。たとえば、re.search正規表現が一致しないdict.get場合、またはキーにdictにエントリがない場合に返されます。None文字列やその他のオブジェクトに追加することはできません。

変数の1つはNone、文字列ではなくです。たぶん、あなたはに忘れてしまったreturnあなたの機能の一つで、または多分ユーザーは、コマンドラインオプションを提供しなかったし、optparseあなたを与えたNoneそのオプションの価値のために。None文字列に追加しようとすると、次の例外が発生します。

send_command(child, SNMPGROUPCMD + group + V3PRIVCMD)

一つgroupまたはSNMPGROUPCMDまたはV3PRIVCMD持ってNone、その値として。


ありがとう!あなたが正しい場合、私のユーザー入力オプションの1つが何らかの理由で採用されていませんでした。私はこれを「名前」対オプションとブームとして追加しました、それはうまくいきました。今、私はこれがオプションとして適切に取られていない理由を見つける必要があります、他のすべてのオプションはうまく機能しています。
安全でない-IT

1
「未設定」は少しあいまいです...変数が定義されておらず、それを使用して何らかの操作を実行しようとすると、を取得する必要がありNameErrorます。設定することもできますが、None( "set to none" = "not set"?)に等しい場合、いくつかを取得する可能性がありTypeErrorます。
ニックT

基本的に(ここのC / Javaの人々のために)none = null
Zoe

24

NoneType単にNoneシングルトンのタイプです:

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

上記の後者のリンクから:

None

タイプの唯一の値NoneTypeNoneデフォルトの引数が関数に渡されない場合のように、値がないことを表すために頻繁に使用されます。への割り当てNoneは違法であり、を発生させSyntaxErrorます。

あなたの場合、連結しようとしているアイテムの1つがであるように見えるNoneため、エラーが発生します。


21

防御的なプログラミングのために、オブジェクトは使用する前にnullがないかチェックする必要があります。

if obj is None:

または

if obj is not None:

2
「is」は、必要な場合にのみ使用してください。最高の防御プログラミングは、テスト、たくさんのテストです。
ユルゲン・A.エアハード

2
防御的なプログラミングは、最も邪悪なものの1つです。そのようなエラーを見つけた場合、これはプログラミングを間違えたことを意味します。「使用前にnullをチェックする」のようなものは、いくつかの重大なエラーを隠すだけです。例外をスローする必要があります。そして、プログラマーにカスタム例外をスローさせないでください。それは本当に面倒です。自然なエラーがスローされます。実際、防御的なプログラミングは、別の言語を使用する必要があるという症状です。
bzim 2018

1
sqlAlchemyを介してデータベースにクエリを実行します。結果はありません。返されるオブジェクトはNoneです。これは結果がないことを意味します。エラーはありません。結果がなしであるかどうかをチェックし、そうでない場合は、結果オブジェクトを使用します。それについて悪いことは何もありません。プログラミングで最も邪悪なことは独断です。
unity1 0020年

17

これは、文字列をNone。である何かと連結しようとしていることを意味します。

Pythonの「null」はありません。 NoneTypeあり、そのタイプです。

このコードは同じ種類のエラーを発生させます:

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


2

エラーメッセージでは、値(文字列とNoneこの例では)を表示して2つのオブジェクトを連結できないことを通知する代わりに、Pythonインタープリターは連結しようとしたオブジェクトのタイプを表示してこれを通知します。すべての文字列strのタイプは、単一Noneインスタンスのタイプが呼び出されている間NoneTypeです。

通常、気にする必要はありません NoneType、が、この例では、を知る必要がありtype(None) == NoneTypeます。


私は非常によく似た問題を抱えており、オブジェクトがNoneTypeであるかどうかを検出しようとしていますが、あなたの肯定は私には機能しません: >>> type(key) <type 'NoneType'> >>> type(key) == NoneType Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'NoneType' is not defined
RuBiCK 2015

2
@RuBiCKNoneTypeはどこにも定義されていません(私が知っていることです)。値がNoneであるかどうかを確認したい場合は、を使用してkey is Noneください(stackoverflow.com/questions/23086383/…を参照)。それ以外の場合はtype(key) == type(None)、同じ効果に使用できます。
Feuermurmel 2016年

1

次のような原因でエラーが発生しています。
>>> None + "hello world"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'NoneType' and 'str'
>>>

PythonのNoneオブジェクトは、他の言語のnullnilなどとほぼ同等です。


0

変数の1つに値が指定されていないため、NoneTypeです。これがなぜであるかを調べる必要があります。おそらくあなたの側の単純な論理エラーです。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.