PyQtのImportについて考えてみる。

どうやってimportしてる?

PyQt使うとき、当然ですがimportが必要ですよね。どうやってimportしてますか?

  • パターン1
import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
 
a = QApplication(sys.argv)
  • パターン2
import sys
import PyQt5.QtCore
import PyQt5.QtWidgets
 
a = PyQt5.QtWidgets.QApplication(sys.argv)

あなたはどっち派?

Takumiはパターン1派です。パターン2はタイプ数が多い。。。面倒臭がりのTakumiには辛い。パターン2の方が名前空間を汚さなくていいんでしょうけどね。

ここでパターン1を正当化してみる。

  • PythonC++とかと比べて、簡潔な記述でプログラムが作れるべき。

  • そもそもプログラマは楽することを目指すべき。(プログラムは楽するために作る???と思ってる私)

ようするに自分の性格だけの問題ではないということを、もっともらしく言ってみたかっただけですが。

名前空間は汚れる?

名前空間が汚れるって、どういうこと?名前が多く入ってきた時、名前空間が汚れると言いますか?じゃ、パターン1のimportでは汚れます。Dirtyです。何故って、クラスその他、かなりの数が定義されてますよ!

でもTakumiは気にしない。Qtのものだということが分かりやすい名前がついてますからね。でも、PyQt4のときは1点問題がありました。QtCoreの中で、bin/oct/hexが関数として定義されてました。組み込み関数とかぶってる!ま、この辺の関数はあまり使って無かったんで気にしてませんでしたけど。

>>> from PyQt4.QtCore import *
>>> hex(10)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: hex(QTextStream): argument 1 has unexpected type 'int'
>>> __builtins__.hex(10)
'0xa'

__builtins__を使えば元の関数も使えますが。

PyQt5はこの問題はないみたいですね。

  • PyQt4.QtCore.bin → PyQt5.QtCore.bin_

  • PyQt4.QtCore.oct → PyQt5.QtCore.oct_

  • PyQt4.QtCore.hex → PyQt5.QtCore.hex_

ちゃんとアンダーバーつけて問題回避してありました。

こんなimport方法も

この記事書きながら気付きました。こんなimportをすれば、”名前空間を汚さない”&”楽に書ける” を両立出来そう。

import sys
from PyQt5 import QtCore, QtWidgets as qt

a = qt.QApplication(sys.argv)

それでもTakumiはパターン1を使い続けますが。