PyWart: Module access syntax

Steven D'Aprano steve+comp.lang.python at pearwood.info
Fri Jan 11 17:02:34 CET 2013


On Thu, 10 Jan 2013 22:01:37 -0800, Rick Johnson wrote:

> Python's module/package access uses dot notation.
> 
>   mod1.mod2.mod3.modN
> 
> Like many warts of the language, this wart is not so apparent when first
> learning the language. The dot seems innocently sufficient, however, in
> truth it is woefully inadequate! Observe:
> 
>  name1.name2.name3.name4.name5
> 
> Can you tell me which names are modules, which are classes, and which
> are methods/functions? Wait, i know the argument you'll use:
> 
>   """I can decipher from spelling! Modules use all lowercase, classes
>   use initial uppercase, and methods use words_sep_by_underscore. I'm so
>   smart!"""

Wrong. My answer is... 

Who cares? Why do you care which names are modules, classes, etc? This is 
Python, and duck-typing rules!

Today I have:

x = mylib.stuff.spam().parrot.speak()

where:

- mylib is a module
- stuff is a separate module imported into mylib
- spam is a class
- parrot a data attribute
- and speak a method. 

But then tomorrow I re-factor the code and turn:

- mylib into a package
- stuff into a module of the package
- spam into a factory function
- parrot into a property
- and speak into a dynamically generated static method created using 
__getattr__.

How do I write this new code? Exactly the same as the old code -- no 
changes are required!

x = mylib.stuff.spam().parrot.speak()

*It doesn't matter* what kind of entity each of the dotted names 
represent, so long as they have the expected interface.


> The solution is obvious by using proper syntax.

Solution to what? You can only have a solution once you have identified a 
problem. You have not identified a problem. In any case, your suggestion 
is *not* obvious.

>  import lib:gui:tkinter:dialogs.SimpleDialog as Blah

Which names are packages, modules, classes, methods, functions, or other 
objects?

Why do you have lib:gui but dialogs.SimpleDialog? Is the rule "classes 
should always be preceded by a dot?"

Following this import:

import lib:gui

how do I access attributes of that module? 

x = lib:gui:function() perhaps? Now I have to remember which attribute 
access uses dot operator and which uses colon operator.

Does this mean there needs to four new be special methods:

__getcolonattribute__
__getcolonattr__
__setcolonattr__ 
__delcolonattr__ 

to match the regular dot operator methods

__getattribute__
__getattr__ 
__setattr__ 
__delattr__ 

? Or do you think that the Python compiler should special-case attribute 
access from modules?


> You /could/ use two colons:
>  
>  import lib::gui::tkinter::dialogs.SimpleDialog as Blah

Before thinking about the syntax, you need to think about the behaviour, 
identify what actual problem you hope to solve, and how you hope to solve 
it. Not just throw random syntax around and hope that it's "obvious".



-- 
Steven



More information about the Python-list mailing list