'NoneType'개체 란 무엇입니까?


87

파이썬 스크립트를 실행할 때이 오류가 발생합니다.

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

'str'이 문자열을 의미한다고 확신하지만 'NoneType'객체가 무엇인지 모르겠습니다. 내 스크립트는 두 번째 줄에서 엉망이되고 첫 번째 줄의 명령이 예상대로 내 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는 변수 중 하나가 설정되지 않았 음을 의미합니다
— mmmmmm

3
NoneType싱글 톤 값의 유형입니다 None. 값 중 하나가 문자열이 아닙니다.
— Martijn Pieters

빠른 & 더러운 :에 연결하는 각 용어를 넣어 str()STR (SNMPSRVUSRCMD) + STR (snmpuser) + ...
— PeterMmm

2
@PeterMmm 그건 끔찍한 생각입니다. 문제는 그저 더 나빠질 것입니다. 처음 에는 변수 중 하나가 None 인 이유를 알아내는 것이 좋습니다 .
— arshajii

답변:


82

NoneType값이 없음None 을 나타내는 객체 인 객체 의 유형입니다 . "아무것도 반환하지 않는"함수의 반환 값입니다. 또한 무언가를 검색하고 찾을 수 있거나 찾을 수없는 함수에 대한 일반적인 기본 반환 값입니다. 예를 들어, 정규 표현식이 일치하지 않거나 키에 dict에 항목이 없을 때 반환됩니다 . 문자열이나 다른 개체에 추가 할 수 없습니다 .Nonere.searchdict.getNone

변수 중 하나는 None문자열이 아니라입니다. 어쩌면 당신은 잊었 return당신의 기능 중 하나에서, 아니면 사용자가 명령 줄 옵션을 제공하지 않았고 optparse준 None해당 옵션의 값. None문자열 에 추가하려고하면 다음 과 같은 예외가 발생합니다.

send_command(child, SNMPGROUPCMD + group + V3PRIVCMD)

하나 group또는 SNMPGROUPCMD또는 V3PRIVCMD이 None값으로.


감사!! 올바른 경우 내 사용자 입력 옵션 중 하나가 어떤 이유로 든 취하지 않았습니다. 나는 이것을 "이름"대 옵션 및 붐으로 추가했습니다. 이제 왜 이것이 옵션으로 제대로 선택되지 않는지 알아 내야합니다. 다른 모든 옵션은 잘 작동합니다.
— 불안 - IT

1
"설정되지 않음"은 약간 모호합니다. 변수가 정의되지 않은 상태에서 작업을 수행하려고하면 NameError. 설정할 수도 있지만 None( "set to nothing"= "not set"?) 과 같으면 TypeError.
— Nick T

기본적으로 (여기의 C / Java 사용자를 위해) none = null
— Zoe

23

NoneType단순히 None싱글 톤 의 유형입니다 .

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

위의 후자 링크에서 :

None

유형의 유일한 값입니다 NoneType. None기본 인수가 함수에 전달되지 않을 때처럼 값이 없음을 나타내는 데 자주 사용됩니다. 에 대한 할당 None은 불법이며 SyntaxError.

귀하의 경우에는 연결하려는 항목 중 하나가 인 것처럼 보이 None므로 오류가 발생합니다.


21

방어적인 프로그래밍을 위해 사용하기 전에 개체가 null인지 확인해야합니다.

if obj is None:

또는

if obj is not None:

2
"is"는 필요한 경우에만 사용해야합니다. 최고의 방어 프로그래밍은 테스트, 많은 테스트입니다.
— Jürgen A. Erhard

2
방어 프로그래밍은 가장 악한 것 중 하나입니다. 이와 같은 오류를 발견하면 실수로 프로그래밍 한 것입니다. "사용하기 전에 null 확인"과 같은 항목은 심각한 오류 만 숨 깁니다. 예외가 발생하도록해야합니다. 프로그래머가 커스텀 예외를 던지도록 만들지 마세요. 정말 번거 롭습니다. 자연 오류를 던지십시오. 사실 방어 프로그래밍은 다른 언어를 사용해야한다는 증상입니다.
— bzim dec.

sqlAlchemy를 통해 데이터베이스를 쿼리합니다. 결과가 없습니다. 반환 된 개체는 없음입니다. 결과가 없음을 의미합니다. 오류가 없습니다. 결과가 없는지 확인하고 그렇지 않은 경우 결과 개체를 사용합니다. 그것에 대해 나쁜 것은 없습니다. 프로그래밍에서 가장 나쁜 점은 독단주의입니다.
— unity100

17

그것은 당신이 문자열을 None.

None은 Python의 "null" NoneType이며 그 유형입니다.

이 코드는 같은 종류의 오류를 발생시킵니다.

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


2

오류 메시지에서 두 객체의 값 (문자열 None과이 예에서는) 을 표시하여 연결할 수 없다는 것을 알리는 대신 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

2
@RuBiCK NoneType는 어디에도 정의되어 있지 않습니다 (내가 알고있는). 값이인지 확인하려면 None그냥 사용 key is None하십시오 ( stackoverflow.com/questions/23086383/… 참조 ). 그렇지 않으면 type(key) == type(None)동일한 효과를 사용할 수 있습니다 .
— Feuermurmel

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 객체는 대략 null 과 같습니다. 다른 언어의 , nil 등과 .


0

변수 중 하나에 값이 지정되지 않았으므로 NoneType입니다. 왜 이것이 당신의 간단한 논리 오류인지 조사해야 할 것입니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.