Pythonは、変数を定義するときに特定のタイプを指定する必要はありません。インタープリターは、実行時に変数のタイプを自動的にチェックし、必要に応じて暗黙的なタイプ変換を実行します。Pythonは動的言語であるため、通常はお勧めしません。タイプ変換。
たとえば、「+」操作を実行するときに、プラス記号の両側にデータがある場合は、追加操作を実行します。両側が文字列の場合は、文字列連結操作を実行します。両側がリストの場合は、マージ操作を実行し、複雑な数値操作も実行します。
インタプリタは、両側の変数のタイプに基づいて、実行時に異なる内部メソッドを呼び出します。プラス記号の両側の変数タイプが同じでなく、タイプ変換を実行できない場合、TypeError例外がスローされます。
実際の開発では、コードの堅牢性を向上させるために、タイプチェックを実行する必要があります。型チェックで最初に頭に浮かぶのは、型を使用してint型を決定するなど、types()を使用することです。
Source Code:
#! /usr/bin/env python2.6
# Author: nock.chen
from types import*
mylist =['nock',100,'100','IT']def delete(mylist, item):iftype(item) is IntType:
mylist.remove(item)delete(mylist,100)print(mylist)
Result:
[' nock','100','IT']
タイプモジュールで一般的に使用されるタイプをいくつか見つけることができます。結果は2.6.9に示されています。
types.BooleanType #ブールタイプ
types.BufferType #バッファタイプ
types.BuiltinFunctionType #lenなどの組み込み関数()
types.BuiltinMethodType #組み込みメソッドは、クラス内のメソッドを参照します
types.ClassType #クラスタイプ
types.CodeType #コードブロックタイプ
types.ComplexType #複数タイプ
types.DictProxyType #辞書プロキシタイプ
types.DictType #辞書タイプ
types.DictionaryType #辞書バックアップタイプ
types.EllipsisType #楕円タイプ
types.FileType #ファイルタイプ
types.FloatType #フローティングポイントタイプ
types.FrameType #フレームオブジェクトのタイプ
types.FunctionType #機能タイプ
types.GeneratorType #ジェネレーター関数を呼び出して生成されたジェネレーター-イテレーターオブジェクトタイプ
types.GetSetDescriptorType #PyGetSetDefを使用する(FrameTypeなど)拡張モジュールで定義されているオブジェクトのタイプ
types.InstanceType #インスタンスタイプ
types.IntType #intタイプ
types.LambdaType #ラムダタイプ
types.ListType #リストタイプ
types.LongType #ロングタイプ
types.MemberDescriptorType #日時などのPyMemberDefを含む拡張モジュールで定義されたオブジェクトタイプ.timedelta.days
types.MethodType #メソッドタイプ
types.ModuleType #モジュールタイプ
types.NoneType #なしタイプ
types.NotImplementedType #NotImplementedの種類
types.ObjectType #オブジェクトタイプ
types.SliceType # slice()返されたオブジェクトタイプ
types.StringType #文字列タイプ
types.StringTypes #文字列オブジェクトの検査を容易にするためのStringTypeとUnicodeTypeを含むシーケンス。
types.TracebackType #sysで.exc_tracebackで見つかったtracebackオブジェクトのタイプ。
types.TupleType #タプルタイプ
types.TypeType #自分で入力する
types.UnboundMethodType #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 #コンパイルする()返されるコードオブジェクトのタイプ。
types.DynamicClassAttribute
types.FrameType #tbにあるフレームオブジェクトのタイプ。 tb_tbがトレースバックオブジェクトの場合はフレーム。
types.FunctionType
types.GeneratorType #ジェネレーター機能によって作成されたジェネレーター-イテレーターオブジェクトタイプ。
types.GetSetDescriptorType #PyGetSetDefを使用する(FrameTypeなど)拡張モジュールで定義されているオブジェクトのタイプ。
types.LambdaType #ラムダ式によって作成されたユーザー定義関数および関数タイプ。
types.MappingProxyType
types.MemberDescriptorType
types.MethodType #ユーザー定義クラスインスタンスのメソッドタイプ。
types.ModuleType
types.SimpleNamespace
types.TracebackType #sysなどのトレースバックオブジェクトのタイプ.exc_info()
types.new_class
types.prepare_class
公式ウェブサイト紹介:https://docs.python.org/3/library/types.html#module-types
上記のPython2からPython3へのバージョンアップグレード中に、タイプモジュールメソッドが削減されました。 typeメソッドを使用する場合、次の問題も発生します。
上に示したように、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 262015,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
のタイプは1つだけです。ほとんどの場合、Python2の長整数型と非常によく似ています。 2種類の整数がなくなったため、それらを区別するために特別な構文を使用する必要はありません。さらに読む:PEP237。
最後に、Pythonでタイプを判断する最良の方法は、組み込み関数 isinstance
を使用して、最高のエクスペリエンスを完成させることです。
公式ウェブサイト紹介:https://docs.python.org/3/library/functions.html#isinstance
Recommended Posts