Pythonで型を判断するための最良の方法

Pythonは、変数を定義するときに特定のタイプを指定する必要はありません。インタープリターは、実行時に変数のタイプを自動的にチェックし、必要に応じて暗黙的なタイプ変換を実行します。Pythonは動的言語であるため、通常はお勧めしません。タイプ変換。

たとえば、「+」操作を実行するときに、プラス記号の両側にデータがある場合は、追加操作を実行します。両側が文字列の場合は、文字列連結操作を実行します。両側がリストの場合は、マージ操作を実行し、複雑な数値操作も実行します。

インタプリタは、両側の変数のタイプに基づいて、実行時に異なる内部メソッドを呼び出します。プラス記号の両側の変数タイプが同じでなく、タイプ変換を実行できない場合、TypeError例外がスローされます。

タイプモジュールのPython2からPython3への変更


実際の開発では、コードの堅牢性を向上させるために、タイプチェックを実行する必要があります。型チェックで最初に頭に浮かぶのは、型を使用して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

Pythonで型を判断するための最良の方法
パスワードの強度を判断するためのPython文字列
pythonでround関数を使用する方法
Pythonでzip関数を使用する方法
pythonでformat関数を使用する方法
Pythonでのパッケージの導入を理解する方法
pythonでファイルを開く方法は何ですか
pythonで円の領域を見つける方法
pythonでのwheelの使用法
pythonコードでラップする方法
Pythonで括弧を省略する方法
pythonでクラスを書く方法
Pythonの数字は何ですか?
PythonでExcelを読む方法
pythonでエラーを表示する方法
pythonでreturnを書く方法
pythonモジュールを表示する方法
Pythonで変数を理解する方法
pythonで変数をクリアする方法
pythonでのタプルの使用法
PythonでSQLiteを使用する方法
pythonでのrbの意味を理解する
およびおよびまたはPythonでの使用方法
pythonでキャッシュファイルを削除する方法
Pythonでサードパーティモジュールを導入する方法
pythonでnull値を表す方法
Python3クローラーでのAjaxの使用
pythonでテキストファイルを保存する方法
pythonでwinプログラムを書く方法
pythonでid関数を実行する方法
Pythonでサードパーティモジュールをインストールする方法
pythonでエラーをカスタムキャッチする方法
pythonでtryステートメントを書く方法
Pythonでプライベート属性を定義する方法
Pythonでカスタムモジュールを追加する方法
Pythonでグローバル変数を理解する方法
インストールされているモジュールをpythonで表示する方法
Python初心者はライブラリの使い方を学びます
Pythonタイムモジュールを学ぶ方法
さまざまなシステムでのPythonopenメソッド
pythonの数値は可変型ですか
pythonで辞書を並べ替える方法
pythonで背景音楽を追加する方法
pythonで相対パスを表す方法
Pythonはリスト内の要素をランダムにシャッフルします
pythonでのadbの機能は何ですか
Pythonのインターフェースに基づいてプログラミングする方法
Pythonはemailモジュールを使用してメールを送信します
ubuntuサーバー環境にpythonをインストールする方法
Pythonゲームで重力をシミュレートする方法
pythonのタブキーはどういう意味ですか
PythonはDoudizhuでカードのシャッフルを実装します
win10でubuntuシステムを開く方法
pythonに最初に精通した、pythonの文法規則
pythonでアシスタントを実行するコードを使用する方法
コマンドラインからpythonを入力する方法
pythonでコード自動プロンプトを設定する方法
pythonを使用してhostsファイルを切り替える方法
pythonでゲームを書く方法を教えてください
pythonでファイルとディレクトリを削除する方法
ubuntuでのHanlpの使用の概要