Лучший способ судить о типах в Python

Python

В Python не требуется указывать конкретный тип при определении переменной. Интерпретатор автоматически проверит тип переменной во время выполнения и при необходимости выполнит неявное преобразование типов. Поскольку Python является динамическим языком, это обычно не рекомендуется. Преобразование типов.

Например, при выполнении операции «+», если две стороны знака «плюс» являются данными, выполняется операция сложения, если две стороны — строки, выполняется операция конкатенации строк, если две стороны — списки, выполняется операция сложения. выполняется операция слияния, и даже сложные операции могут быть выполнены.

Интерпретатор будет вызывать различные внутренние методы во время выполнения в зависимости от типов переменных с обеих сторон. Когда типы переменных по обе стороны от знака «плюс» различны и преобразование типов не может быть выполнено, будет выдано исключение TypeError.

Изменения в модуле типов с Python2 на Python3

В реальной разработке, чтобы повысить надежность кода, нам по-прежнему необходимо выполнять проверку типов. Первое, что приходит на ум при проверке типов, это использование types(), например использование типов для определения типа int:

Source Code:

#!/usr/bin/env python2.6
#Author: nock.chen
from types import *
mylist = ['nock', 100, '100', 'IT']

def delete(mylist, item):	
	if type(item) is IntType:
		mylist.remove(item)
						
delete(mylist, 100)
print(mylist)

Result:

['nock', '100', 'IT']

Мы можем найти некоторые часто используемые типы в модуле типов, результаты показаны в 2.6.9:

types.BooleanType              #  bool类型
types.BufferType               #  buffer类型
types.BuiltinFunctionType      #  内建函数,比如len()
types.BuiltinMethodType        #  内建方法,指的是类中的方法
types.ClassType                #  类类型
types.CodeType                 #  代码块类型
types.ComplexType              #  复数类型
types.DictProxyType            #  字典代理类型
types.DictType                 #  字典类型
types.DictionaryType           #  字典备用的类型
types.EllipsisType             #  Ellipsis类型
types.FileType                 #  文件类型
types.FloatType                #  浮点类型
types.FrameType                #  框架对象的类型
types.FunctionType             #  函数类型
types.GeneratorType            #  通过调用生成器函数生成的generator-iterator对象类型
types.GetSetDescriptorType     #  用PyGetSetDef(如FrameType)在扩展模块中定义的对象的类型
types.InstanceType             #  实例类型
types.IntType                  #  int类型
types.LambdaType               #  lambda类型
types.ListType                 #  列表类型
types.LongType                 #  long类型
types.MemberDescriptorType     #  在扩展模块中定义的对象类型,包括PyMemberDef,如datetime.timedelta.days        
types.MethodType               #  方法类型
types.ModuleType               #  module类型
types.NoneType                 #  None类型
types.NotImplementedType       #  NotImplemented的类型
types.ObjectType               #  object类型
types.SliceType                #  slice()返回的对象类型
types.StringType               #  字符串类型
types.StringTypes              #  一个包含StringType和UnicodeType的序列,用于方便对任何字符串对象进行检查。
types.TracebackType            #  在sys.exc_traceback中发现的traceback对象的类型。
types.TupleType                #  元组类型
types.TypeType                 #  类型本身
types.UnboundMethodType        #  另一个名字for MethodType
types.UnicodeType              #  Unicode字符字符串的类型(例如,u ' spam)
types.XRangeType               #  xrange()返回的范围对象的类型

Введение на официальном сайте: https://docs.Python.org/2/library/types.HTML

К версии Python3,typesМодульный подход был значительно сокращен, а именно:

types.BuiltinFunctionType               
types.BuiltinMethodType         # 内置函数的类型,如len()或sys.exit(),以及内置类的方法。(这里,“内置”的意思是“用C写”。)
types.CodeType                  # 通过compile()返回的代码对象类型。
types.DynamicClassAttribute
types.FrameType                 # 框架对象的类型,如在tb中发现的。tb_frame如果tb是一个traceback对象。
types.FunctionType
types.GeneratorType             # 由生成器函数创建的generator - iterator对象类型。
types.GetSetDescriptorType      # 用PyGetSetDef(如FrameType)在扩展模块中定义的对象的类型。
types.LambdaType                # 由lambda表达式创建的用户定义函数和函数的类型。
types.MappingProxyType
types.MemberDescriptorType
types.MethodType                # 用户定义类实例的方法类型。
types.ModuleType
types.SimpleNamespace
types.TracebackType             # traceback对象的类型,如sys.exc_info()
types.new_class
types.prepare_class

Введение на официальном сайте: https://docs.Python.org/3/library/types.HTML#module-types

Тип проверки типа устарел

Во время обновления версии с Python2 на Python3, указанный выше, метод модуля типов был сокращен. Если вы используете метод типа, возникнут следующие проблемы:

Как показано выше, типы i и n различны. На самом деле UserInt наследует int, поэтому такое суждение проблематично. Когда мы расширяем встроенный тип Python, результат, возвращаемый по типу, недостаточно точен. Давайте посмотрим на другой пример:

Результат сравнения типов a и b относится к одному и тому же типу, и результат явно неточен. Экземпляры этого классического класса типа возвращают тот же результат, а это не то, что нам нужно. Для встроенных типов-примитивов использование tpye для проверки не представляет проблемы, но применительно к другим ситуациям этот тип ненадежен.

На данный момент нам нужно использовать встроенную функциюisinstanceНиже приведен пример проверки типов:

isinstance(object, class_or_type_or_tuple)

object представляет объект, а classinfo может быть прямым или косвенным именем класса, примитивным типом или кортежем, состоящим из них.

nock:ucode nock$ python3
Python 3.5.1 (default, Dec 26 2015, 18:08:53) 
[GCC 4.2.1 Compatible Apple LLVM 7.0.2 (clang-700.1.81)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> isinstance(2, float)
False
>>> isinstance(2, int)
True
>>> isinstance((2, 3), list)
False
>>> isinstance((2, 3), tuple)
True
>>> isinstance({'name': 'nock'}, tuple)
False
>>> isinstance({'name': 'nock'}, dict)
True
>>> isinstance([1, 100, 101], (str, list, tuple))
True
>>> isinstance(2 ** 31, dict)
False
>>> isinstance(2 ** 31, long)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'long' is not defined
>>> isinstance(2 ** 31, int)
True

Python2 подготовился к числам без плавающей запятойintа такжеlongТипы. Максимальное значение типа int не может превышатьsys.maxint, и это максимальное значение зависит от платформы. Это можно сделать, добавивLдля определения длинного целочисленного типа, который, очевидно, имеет более широкий диапазон чисел, чем тип int. В Python3,只有一种Целочисленный типint, который в большинстве случаев очень похож на long int в Python 2. Поскольку не существует двух типов целых чисел, нет необходимости использовать специальный синтаксис для их различения.Дополнительная литература: PEP 237.

В конце концов, лучший способ сделать вывод в Python — это использовать встроенные функции.isinstanceСделано это лучший опыт.

Введение на официальном сайте: https://docs.Python.org/3/library/functions.HTML#является экземпляром