2011-08-17 5 views
28

나는 연결 연산에서 문자열을 다른 문자열에 추가하는 동안 형식 불일치를 파악하려고합니다.변수가 튜플, 문자열 또는 정수인지 확인하는 방법은 무엇입니까?

기본적으로 반환되는 오류는 형식 오류입니다 (문자열과 튜플을 연결할 수 없음). 그래서 문자열 대신 튜플로 값을 할당 한 부분을 알아 내고 싶습니다.

내가 할당 한 모든 값은 문자열이므로 튜플이 어디서 왔는지 파악해야하므로 파이썬에서 변수가 무엇인지 유형을 파악하는 방법이 필요하다고 생각했습니다. .

지금까지 pdb를 사용하여 변수의 내용을 확인할 수 있었고 기대했던 값을 올바르게 얻을 수있었습니다. 하지만 나는 또한 변수의 유형을 알고 싶습니다 (논리에 의해, 컴파일러가 유형 오류를 발생시킬 수 있다면 변수 안에 무엇이 있는지를 알 수 있고 수행 할 작업과 호환 될 수 있음을 의미합니다. 가치/깃발을 얻을 수있는 방법이어야 함).

파이썬에서 변수의 유형을 인쇄하는 방법이 있습니까?

나는 모든 변수를 명시 적으로 문자열로 변경하려고했지만 str (myvar)을 강제로 실행하는 것은 불가능하므로 문자열을 사용하는 모든 곳에서 문자열 유형으로 캐스팅 할 수는 없습니다.

+1

변수는 파이썬에서 타입을 가질 수 없으며, 변수들에 의해 참조되는 객체들만이 파이썬에서 타입을 가지지 않습니다. 이 때문에 실제 형식 캐스트가없고 개체 변환 기능 만 있습니다. –

+0

실제로 Jurgen; 나는 파이썬이 두포에서 어떻게 작동하는지 완전히 알지 못한다. 그러나 객체 지향 언어라고 가정한다. 그래서 변수를 만들면 올바른 데이터 유형의 객체를 만들고 포인터로 참조 할 것이다. 변수 내가 실제로 개체 문자열 (또는 다른 데이터 형식)의 인스턴스를 사용하고 있습니다.끝점은 그 객체의 타입을 얻는 것입니다 : –

답변

23

당신은 사용

type(varname) 

하는 것이다 isinstance의 출력 INT, STR, 플로트, 등등 ...

+0

'__class__ '을 사용하는 것은 대부분의 경우'type'을 사용하는 것보다 낫습니다. 왜냐하면 대부분의 상황에서 그들은'type'이 타입 모든 구식 클래스의 '인스턴스'가됩니다. [이 질문에 대한 참조] (http://stackoverflow.com/questions/1060499/difference-between-typeobj-and-obj-class) –

+0

고마워요 가브리엘; 런타임시 pdb에서 사용됩니까? 왜냐하면 내가 형식 (myvarname)을하려고하면 구문 오류가 발생합니다. –

+0

방금 ​​인쇄 유형 (myvar)을 추가했으며 유형을 pdb로했습니다. –

13

메이크업 사용?

if isinstance(var, int): 

if isinstance(var, str): 

if isinstance(var, tuple): 
+0

'str'에 대한 테스트는'unicode' 문자열에서 실패합니다. 또한, 'isinstance (var, tuple)'은'list's가 될 수있는 변수를 놓치게됩니다. 이러한 변수는 종종 이러한 상황에서 발생합니다. 물론 var가'list'의 인스턴스라면 오류가 발생할 수 있습니다.하지만 상황에 따라 어떤 일이 벌어 질지 확실히 알고있는 것이 좋습니다. –

+0

파이썬 3에서는 일련의 유형을 사용하여 다음을 테스트 할 수 있습니다 :'isinstance (var, (tuple, list))' – bugmenot123

4

isinstance(obj, basestring)을 사용하여 (파이썬 2.x로 가정) 테스트하고 싶을 것입니다. isinstance, type을 사용하고 __class__ 속성을 호출하는 옵션이 있지만 isinstance은 여기에서 원하는 것일 수 있습니다. 세 가지 옵션 간의 차이점에 대한보다 철저한 처리를 위해 this article을 살펴보십시오.

+0

Thanks Darren; 아마 당신의 제안을 사용하여 테스트를 할 것이지만, 지금은 pdb를 사용하고 있습니다. 그래서 어느 것이 문제가있는 var인지 알아낼 수 있고 같은 실수를하지 않아도됩니다. (나는 방어 코딩을 좋아하지만 동시에, 가능한 한 잡기 위해 수표에 의존하는 대신 실수로 실수를 피하는 것을 선호합니다. 실수). __class__ 속성도 있다는 점이 흥미 롭습니다. 그것을 결코 들어 보지 못했다. 답장을 보내 주셔서 감사합니다; –

74
isinstance(obj, tuple) 
isinstance(obj, basestring) 
isinstance(obj, int) 
+0

; 이 프로그램을 실행하는 동안 확인을 위해 좋습니다,하지만 pdb 디버깅하는 동안 값을 가져 오는 중입니다. 이것은 문제를 피할 수있는 좋은 방법입니다! –

1

repr (object)은 유형 및 값을 표시해야하는 객체의 텍스트 설명을 제공합니다. 귀하는 디버거에서 이것을 인쇄하거나 볼 수 있습니다.

단순 값의 경우 repr은 일반적으로 값을 코드에 그대로 쓰는 것과 같은 문자열을 반환합니다. class'es

__repr__ 

를 오버라이드 (override)하는 경우 사용자 정의 클래스의 경우는 클래스 이름과 개체 ID, 또는 다른 무언가를 제공합니다.

+0

답장을 보내 주셔서 감사합니다. 나는 repr을 시도했으나 변수의 값을 문자열로 반환한다. 그래서 p (varname)가하는 것과 같은 일을한다. 내가 언급 한대로, 가치와 개체의 설명? –

+1

아니요. str 또는 unicode에 대한 문자열 리터럴을 반환합니다. * 따옴표를 포함하여 *이를 해당 유형으로 인식해야합니다. 정수형에서는 따옴표가없는 숫자를 반환하고 다른 숫자 형에서는 비슷한 숫자를 반환합니다. 사용자 정의 클래스 A의 경우 기본적으로 과 같은 것을 반환하지만 일부 클래스는이 설명 문자열을 덮어 씁니다. –

+0

나는 본다; 참으로 정말 유용합니다, 고마워요 !! –

1

if 문에서 var 유형을 확인하려면 if type(varname) == "tuple": 구조가 작동하지 않습니다. 그러나 이것들은 :

+0

대신 isinstance를 사용해야합니다. type()은 상속에 있어서는 위험합니다. – bugmenot123

관련 문제