В 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#является экземпляром