はじめに
ぶっぶーですわ!🙅♂️1 nikkieです。
表題の件について見ていきましょう。
某書籍レビューでお見かけして、記憶に刻まれた思い出があります。
目次
- はじめに
- 目次
- 動作環境
- flake8 「ぶっぶーですわ!」
- なぜダメか ー サブクラスを考慮しないから
- pycodestyleが「ぶっぶーですわ!」
- PEP 8にも書いてありました
- 終わりに
- P.S. 本日は皆さま、お誕生日おめでとうございます
動作環境
- Python 3.11.4
- flake8 6.1.0
pip install flake8
で以下が入りました
mccabe 0.7.0 pycodestyle 2.11.0 pyflakes 3.1.0
flake8 「ぶっぶーですわ!」
E721が送出されます。
value = 108 if type(value) == int: print("整数です")
% python okorare.py 整数です
% flake8 okorare.py okorare.py:2:4: E721 do not compare types, for exact checks use `is` / `is not`, for instance checks use `isinstance()`
なぜダメか ー サブクラスを考慮しないから
組み込み関数typeのドキュメントより
https://docs.python.org/ja/3/library/functions.html#type
オブジェクトの型の判定には、 isinstance() 組み込み関数を使うことが推奨されます。これはサブクラスを考慮するからです。
組み込み関数isinstanceのドキュメント2
https://docs.python.org/ja/3/library/functions.html#isinstance
object 引数が classinfo 引数に指定した型、またはその (直接、間接、または 仮想 の) サブクラスのインスタンスである場合に True を返します。
サブクラスを考慮しないことを確かめる
class User: ... class RoyalUser(User): ... user = User() if type(user) == User: print("userはUserです") royal_user = RoyalUser() if type(royal_user) == RoyalUser: print("royal_userはRoyalUserです") if type(royal_user) == User: print("royal_userはUserです")
RoyalUserはUserのサブクラスです。
ですが、type(royal_user) == User
はFalse
を返します(サブクラスを考慮していない!)
% python okorare.py userはUserです royal_userはRoyalUserです
isinstanceはサブクラスを考慮!
typeの代わりにisinstanceを使うように書き換えます。
user = User() if isinstance(user, User): print("userはUserです") royal_user = RoyalUser() if isinstance(royal_user, RoyalUser): print("royal_userはRoyalUserです") if isinstance(royal_user, User): print("royal_userはUserです")
% python okorare.py userはUserです royal_userはRoyalUserです royal_userはUserです
「royal_userはUserです」がありますね。
isinstance(royal_user, User)
はTrue
、サブクラスを考慮している!
pycodestyleが「ぶっぶーですわ!」
flake8は、pyflakes・pycodestyle・mccabeが三位一体となった静的解析ライブラリです。
送出するエラーコードについて
https://flake8.pycqa.org/en/latest/user/error-codes.html
- pyflakesが送出するのは、F
- mccabeは、C
- pycodestyleは、EとW
「E721 do not compare types」はpycodestyleによるのですね。
https://pycodestyle.pycqa.org/en/latest/intro.html#error-codes
E721 do not compare types, use ‘isinstance()’
PEP 8にも書いてありました
冒頭で紹介したFlake8 RulesからPEP 8にリンクがありました。
「Programming Recommendations」の中に
Object type comparisons should always use isinstance() instead of comparing types directly:
意訳 オブジェクトの型の比較は、型を直接比較する代わりに常にisinstanceを使うべき
PEP 8でかなり強く「ぶっぶーですわ」と言っていたのですね
終わりに
オブジェクトの型を比較したいときに、type
の返り値を型と比較するのはぶっぶーですわ!🙅♂️
代わりにisinstance
を使いましょう。サブクラスも考慮してくれます
- pycodestyle (flake8)「ぶっぶーですわ!」
- 組み込み関数typeのドキュメント「ぶっぶーですわ」
- PEP 8「ぶっぶーですわ!!」
OSSのコードを読んでいるとisinstance
は頻出な書き方という印象です。
私はisinstance
に慣れきっているのですが、気を張っていなくてもflake8(ツール)が教えてくれますね。
P.S. 本日は皆さま、お誕生日おめでとうございます
みかん!色がイメージカラー🧡
— 【公式】東海バスTokaiBus (@tokaibus_oa) 2023年7月31日
8月1日は「Aqours」のリーダー、高海千歌ちゃんの誕生日!
お誕生日おめでとうございます✨#高海千歌生誕祭2023#高海千歌誕生祭2023
チカっちー!!!🍊🍊🍊 pic.twitter.com/nStl3X47px
8月1日は、栄おばあちゃんの誕生日🎉#サマーウォーズ#SummerWars
— スタジオ地図 (@studio_chizu) 2023年8月1日
▼劇場上映情報
期間限定で「サマーウォーズ」上映中!
🎥:https://t.co/QFEeTbryem
▼#スタジオ地図オーケストラ ライブ盤
映画の世界をオーケストラサウンドで追体験🎻🎺
🎧:https://t.co/1OIhtxGayo pic.twitter.com/ta9BdHVKdj
#かぐや様は告らせたい
— ★赤坂アカ 集英社作品 総合アカ★『かぐや様』『【推しの子】』『恋愛代行』 (@akasakashueisha) 2023年8月1日
【㊗#8月1日は白銀圭の誕生日🎂】
🔔本日は…
兄と一緒でかぐやが大好き!!💞
反抗期🗯がなかなか終わらない
白銀家の長女🩰#白銀圭 のお誕生日です🎉
誕生日を記念して
特製スマホ壁紙をプレゼント🎁
ぜひ使ってみてください📱♪#圭お誕生日おめでとう #かぐや様 pic.twitter.com/8jgQAXJorm
╭━━━━━━━━━━━━━╮
— AMOCAFE_WEB_SHOP (@amocafe_webshop) 2023年8月1日
🎂Happy Birthday 南夢芽 8/1🎉
╰━━━━━━v━━━━━━╯
『グリッドマン ユニバース』から南夢芽のバースデーグッズがWEBSHOP限定で登場🏝️
自然に微笑む表情がとっても眩しいですね😊
販売期間:8/1〜8/16https://t.co/44A3Ugo5sa#GRIDMAN_UNIVERSE pic.twitter.com/I95Z8nFWuh
入れ替えたら1/8ですからね!
エミリー『Wow! 見てください! これが噂の……山鉾巡行!』
— ミリオンライブ! シアターデイズ【公式】 (@imasml_theater) 2023年8月1日
◤ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
セカンドヘアスタイルガシャ
~プライベートドレス編~
____________◢
🌻8/11 14:59 まで!#私服SHSエミリーが可愛い pic.twitter.com/o7zB2Mi2nU