복붙노트

[PYTHON] Python의 isinstance ()를 사용하여 변수가 숫자인지 제대로 확인하는 방법은 무엇입니까?

PYTHON

Python의 isinstance ()를 사용하여 변수가 숫자인지 제대로 확인하는 방법은 무엇입니까?

다음과 같은 일을하는 오래된 파이썬 코드를 발견했습니다.

if type(var) is type(1):
   ...

예상대로, pep8은 isinstance ()의 권장 용도에 대해 불평합니다.

이제 문제는 numbers 모듈이 Python 2.6에 추가되었고 Python 2.5 이상에서 작동하는 코드를 작성해야한다는 것입니다.

그래서 isinstance (var, Numbers.number)가 해결책이 아닙니다.

이 경우 적절한 해결책은 무엇입니까?

해결법

  1. ==============================

    1.파이썬 2에서는 types 모듈을 사용할 수 있습니다 :

    파이썬 2에서는 types 모듈을 사용할 수 있습니다 :

    >>> import types
    >>> var = 1
    >>> NumberTypes = (types.IntType, types.LongType, types.FloatType, types.ComplexType)
    >>> isinstance(var, NumberTypes)
    True
    

    여러 유형에 대해 테스트하기 위해 튜플을 사용합니다.

    후드에서 IntType은 int 등의 별칭 일뿐입니다.

    >>> isinstance(var, (int, long, float, complex))
    True
    

    복잡한 타입은 파이썬이 복소수를 지원하도록 컴파일되어야합니다. 이 경우 try / except 블록을 사용하지 않으려면 다음을 수행하십시오.

    >>> try:
    ...     NumberTypes = (types.IntType, types.LongType, types.FloatType, types.ComplexType)
    ... except AttributeError:
    ...     # No support for complex numbers compiled
    ...     NumberTypes = (types.IntType, types.LongType, types.FloatType)
    ...
    

    또는 형식을 직접 사용하는 경우 :

    >>> try:
    ...     NumberTypes = (int, long, float, complex)
    ... except NameError:
    ...     # No support for complex numbers compiled
    ...     NumberTypes = (int, long, float)
    ...
    

    파이썬 3 유형에는 더 이상 표준 유형 별명이 없으며, 복합체는 항상 사용 가능하며 더 이상 긴 대 int의 차이점이 없으므로, Python 3에서는 항상 다음을 사용합니다.

    NumberTypes = (int, float, complex)
    

    마지막으로 중요한 것은 number.Numbers 추상 기본 유형 (Python 2.6의 새로운 기능)을 사용하여 위의 유형에서 직접 파생되지 않는 사용자 정의 숫자 유형을 지원할 수 있습니다.

    >>> import numbers
    >>> isinstance(var, numbers.Number)
    True
    

    이 검사는 또한 decimal.Decimal () 및 fractions.Fraction () 객체에 대해 True를 반환합니다.

    이 모듈은 복합 유형이 사용 가능하다는 가정을합니다. 그렇지 않으면 가져 오기 오류가 발생합니다.

  2. ==============================

    2.Python 2는 int, float, long 및 complex의 4 가지 유형을 지원하며 python 3.x는 3, int, float 및 complex를 지원합니다.

    Python 2는 int, float, long 및 complex의 4 가지 유형을 지원하며 python 3.x는 3, int, float 및 complex를 지원합니다.

    >>> num = 10
    >>> if isinstance(num, (int, float, long, complex)): #use tuple if checking against multiple types
          print('yes it is a number')
    
    yes it is a number
    >>> isinstance(num, float)   
    False
    >>> isinstance(num, int)
    True
    >>> a = complex(1, 2)
    >>> isinstance(a, complex)
    True
    
  3. ==============================

    3.오리를 타자를 치기에서 이것을 사용하고있는 무슨을에 따라서 더 나은 접근 일 수 있었다 (확실히 일반적으로 추천된다). 마르틴 피터스 (Martijn Pieters)의 접근법에 대한 문제점은 당신이 항상 목록에서 몇 가지 유형의 번호를 놓치게된다는 것입니다. 내 머리 꼭대기에서 sympy 유리수, 임의의 정밀도 정수 및 복소수 구현과 같은 코드는 작동하지 않습니다.

    오리를 타자를 치기에서 이것을 사용하고있는 무슨을에 따라서 더 나은 접근 일 수 있었다 (확실히 일반적으로 추천된다). 마르틴 피터스 (Martijn Pieters)의 접근법에 대한 문제점은 당신이 항상 목록에서 몇 가지 유형의 번호를 놓치게된다는 것입니다. 내 머리 꼭대기에서 sympy 유리수, 임의의 정밀도 정수 및 복소수 구현과 같은 코드는 작동하지 않습니다.

    한 가지 대안은 다음과 같은 함수를 작성하는 것입니다.

    def is_number(thing):
        try:
            thing + 1
            return True
        except TypeError:
            return False
    

    이 코드는 합리적인 숫자 구현과 함께 작동해야합니다. 물론 중요한 단점이 있습니다. 또한 숫자가 아닌 숫자를 무리하게 구현하면 작동합니다 (예 : 더하기 연산자가 오버로드되어 정수를 허용하는 경우).

    또 다른 대안은 (숫자가 무엇인지를 알 필요가있는 이유에 따라) 번호가 맞다고 생각하는 것입니다. 그렇지 않으면 코드의 어느 비트가 숫자를 필요로하든 오류가 발생하지 않습니다.

    나는이 접근법이 항상 (어떤 사람들과는 달리 ...) 더 낫다는 것을 말하지 않고 단지 고려할 가치가있는 것입니다.

  4. from https://stackoverflow.com/questions/11204789/how-to-properly-use-pythons-isinstance-to-check-if-a-variable-is-a-number by cc-by-sa and MIT license