[PyQt] Symbol naming system for PyQt under Python 3

Paul A. Giannaros paul at giannaros.org
Fri Dec 12 22:57:22 GMT 2008


On Fri, Dec 12, 2008 at 10:28 PM, Giovanni Bajo <rasky at develer.com> wrote:
> On 12/12/2008 11:18 PM, Paul A. Giannaros wrote:
>>
>> On Fri, Dec 12, 2008 at 6:27 PM, Phil Thompson
>> <phil at riverbankcomputing.com> wrote:
>>>
>>> On Fri, 12 Dec 2008 18:09:56 +0000, "Paul A. Giannaros"
>>> <paul at giannaros.org> wrote:
>>>>
>>>> Hi all,
>>>>
>>>> When there was a discussion regarding PyQt wishes for Python 3.0 I
>>>> proposed changing the mechanism by which you refer to symbols[1] .
>>>> Thus something like "QtGui.QApplication" could be refered to as
>>>> "Qt.Application".
>>>> As Qt does not use namespaces itself, there would be no conflicts of
>>>> names. The idea is that you'd then import any module and its symbols
>>>> would then be added to the Qt namespace when you've done so. This
>>>> system would therefore save on redundant typing while sidestepping
>>>> namespace pollution.
>>>>
>>>> Any thoughts on this?
>>>
>>> Nothing printable ;)
>>>
>>> You can already do Qt.QApplication is you really want to, so you are
>>> saving
>>> yourself one character.
>>
>> "from PyQt4 import Qt" imports every module if I'm not mistaken.
>> Wanting a sane way of referencing Qt's symbols is not the same as
>> wanting every symbol from every module to be imported.
>
> How is it possible to implement your proposal without importing every module
> at the same time, and without playing magic tricks?
>
>> Surely losing that one character is great if it's unnecessary. The
>> QtRuby guys seem to use exactly the same naming system that I propose
>> and it works fine for them and looks much better.
>
> In the number-of-character race, I win with star-imports:
>
> from PyQt4.QtCore import *
> from PyQt4.QtGui import *
>
> w = QWidget()
>
> Since 99.999% of the names in there starts with "Q", I never ever have a
> conflict. The code is easy on the eye, and resembles its C++ equivalent.

Way out, I'm afraid. ~60% of QtCore symbols start with a "Q", and a
further ~21% start with a "q". That still leaves around 32 symbols
(16%) once you weed out __doc__ etc. Some have ridiculously common
names ("center", "flush", "bin"), and some conflict with basic Python
builtins ("hex" and "oct"). QtGui is much better but still has a
"Display" class.
Anyways, I believe I've seen it mentioned on this list that "import *"
with PyQt method is frowned upon.

So you in summary, one can either:
 * List each class on importing
 * Import a module and use the "QtCore.QCoreApplication" form
 * Pollute the namespace
 * Load all Qt modules

None of those are particularly appealing. I currently use "import *",
but thought it'd be great to dodge this altogether.


> Doh, so you're proposing that importing a module has the side effect of
> populating a different namespace. This is absolutely implicit and
> counter-intuitive, and has no equivalent in the standard library nor any
> external library I can think of.

No, my proposal is dropping the leading Q and using a Qt namespace
that doesn't require loading all modules. That way does seem
particularly odd, though. Perhaps a less counter-intuitive method
would be something like

from pyqt4 import Qt
Qt.load('core', 'gui', 'svg')

?

On Fri, Dec 12, 2008 at 10:44 PM, Phil Thompson
<phil at riverbankcomputing.com> wrote:
>>> A class in PyQt should have the same name as the class in Qt if at all
>>> possible.
>>
>> Could you please elaborate as to why?
>
> Least surprise. Consistency with existing documentation. Common sense.

Least surprise is important, but do you think any programmers coming
from a Qt/C++ background would be seriously distracted by it?
The second strikes me as an incredibly minor issue.
The third I'd dispute as another project pretty similar to PyQt uses it.


More information about the PyQt mailing list