'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당신의 기능 중 하나에서, 아니면 사용자가 명령 줄 옵션을 제공하지 않았고 optparseNone해당 옵션의 값. None문자열 에 추가하려고하면 다음 과 같은 예외가 발생합니다.

send_command(child, SNMPGROUPCMD + group + V3PRIVCMD)

하나 group또는 SNMPGROUPCMD또는 V3PRIVCMDNone값으로.


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