Re: self.__dict__ tricks

Discussion in 'Python' started by Steven D'Aprano, Oct 30, 2009.

  1. On Thu, 29 Oct 2009 21:16:37 -0500, Tim Johnson wrote:

    > This is not a request for help but a request for comments: Consider the
    > following code and note that 1)The initializer uses the dictionary style
    > of arguments 2)The check loop executes before all of the class variables
    > are declared


    Could you explain what problem you are trying to solve?


    > class formLoader():


    Idiomatic Python is to use CamelCase for classes.


    > def __init__(self,**kw):
    > self.fileName = None
    > self.record = None
    > self.string = None
    > ## Uncomment below to see that only fileName, record
    > ## and string are recorded by __dict__
    > #std.debug("self.__dict__",self.__dict__)
    > for k in kw.keys():


    In recent versions of Python, this is best written as

    for k in kw:

    > if k in self.__dict__:
    > self.__dict__[k] = kw[k]


    Is your intention to ensure that the only keyword arguments allowed are
    fileName, record and string?

    Perhaps the easiest way to do that is:

    for k in kw:
    if k not in ('filename', 'record', 'string'):
    raise Exception() # whatever...
    setattr(self, k) = kw[k]



    > else:
    > raise AttributeError(


    In my opinion, AttributeError is not appropriate here. Passing an invalid
    parameter shouldn't raise the same error as failing an attribute look-up.
    That's misleading and confusing.


    > "%s is not a class member. Use one of ('%
    > s')" % (repr(k),"', '".join
    > (self.__dict__.keys())))


    [Aside: eight space tabs are *WAY* too big for Usenet and email. You
    should use four spaces, or even two, when posting here.]

    It is idiomatic Python to use "instance attributes" to refer to
    attributes attached to instances, and "class attributes" to refer to
    those attached to classes. Talking about "class members" will confuse
    Python developers who aren't also familiar with Java or C++. (I know it
    confuses *me* -- are class members shared by all instances in a class, as
    the name implies, or are they individual to the instance, as your code
    implies?)

    I also should point out that your trick will fail if you are using
    __slots__.



    > self.tokens =

    ["form","input","textarea","select","option","form"]
    > self.inputTypes =
    > ["button","checkbox","file","hidden","image","password",
    > "radio","reset","submit","text"]
    > self.inputValTypes = ["file","hidden","password","text"]
    > self.colnames
    > = [] ## case-insensitive column names
    > self.formIndexes = [] ##
    > Index forms in outer list



    Is any of that relevant to the trick you are asking for comments for? If
    not, why is it here?


    > I'd welcome comments - such as any other applications.


    Personally, I don't like it. The method signature makes it impossible to
    tell what arguments are excepted, and it forces me to use keywords even
    if I'd prefer to use positional arguments. I prefer to let the
    interpreter check the arguments for me:


    class FormLoader():
    def __init__(self, fileName=None, record=None, string=None):
    self.fileName = fileName
    self.record = record
    self.string = string

    That's all it takes, and you get the benefit of a method signature that
    makes it obvious what arguments it takes.



    --
    Steven
    Steven D'Aprano, Oct 30, 2009
    #1
    1. Advertising

  2. On Fri, 30 Oct 2009 15:55:04 +1100, Ben Finney wrote:

    > Steven D'Aprano <> writes:
    >
    >> On Thu, 29 Oct 2009 21:16:37 -0500, Tim Johnson wrote:
    >> > class formLoader():

    >>
    >> Idiomatic Python is to use CamelCase for classes.

    >
    > Or rather: Instead of camelCase names, idiomatic Python is to use
    > TitleCase names.


    Thank you for the correction. I always mix up those two.


    --
    Steven
    Steven D'Aprano, Oct 30, 2009
    #2
    1. Advertising

  3. Steven D'Aprano

    MRAB Guest

    Steven D'Aprano wrote:
    > On Fri, 30 Oct 2009 15:55:04 +1100, Ben Finney wrote:
    >
    >> Steven D'Aprano <> writes:
    >>
    >>> On Thu, 29 Oct 2009 21:16:37 -0500, Tim Johnson wrote:
    >>>> class formLoader():
    >>> Idiomatic Python is to use CamelCase for classes.

    >> Or rather: Instead of camelCase names, idiomatic Python is to use
    >> TitleCase names.

    >
    > Thank you for the correction. I always mix up those two.
    >

    Wouldn't it be clearer if they were called dromedaryCase and
    BactrianCase? :)
    MRAB, Oct 30, 2009
    #3
  4. Steven D'Aprano

    Tim Golden Guest

    MRAB wrote:
    > Steven D'Aprano wrote:
    >> On Fri, 30 Oct 2009 15:55:04 +1100, Ben Finney wrote:
    >>
    >>> Steven D'Aprano <> writes:
    >>>
    >>>> On Thu, 29 Oct 2009 21:16:37 -0500, Tim Johnson wrote:
    >>>>> class formLoader():
    >>>> Idiomatic Python is to use CamelCase for classes.
    >>> Or rather: Instead of camelCase names, idiomatic Python is to use
    >>> TitleCase names.

    >> Thank you for the correction. I always mix up those two.
    >>

    > Wouldn't it be clearer if they were called dromedaryCase and
    > BactrianCase? :)


    It's not often I really get a laugh out of this
    mailing list, but that really made me chuckle.

    Thanks :)

    TJG
    Tim Golden, Oct 30, 2009
    #4
  5. On Fri, 30 Oct 2009 11:16:29 -0500, Tim Johnson wrote:

    > On 2009-10-30, Steven D'Aprano <>
    > wrote:
    >>
    >> Could you explain what problem you are trying to solve?
    >>
    >>
    >>> class formLoader():

    >
    > Hi Steve
    > In a nutshell:
    > The 'problem' is to parse a form in such a way that tags which are to
    > be modified are represented as dictionaries. The 'grunt' work is done.
    > This class will probably grow with time.


    The standard way of doing this is to list the arguments as parameters,
    together with their defaults:

    def __init__(self, filename=None, record=None, string=None):
    ...


    Then Python will do the error checking for your, and raise an exception
    if the caller passes an unexpected argument. Can you explain why this
    isn't enough for your needs, and you need to do something else?


    >> Idiomatic Python is to use CamelCase for classes.

    > Can you point me to a discussion on Idiomatic Python, CamelCase and
    > other matters?


    See PEP 8:

    http://www.python.org/dev/peps/pep-0008/



    >> In my opinion, AttributeError is not appropriate here. Passing an
    >> invalid parameter shouldn't raise the same error as failing an
    >> attribute look-up. That's misleading and confusing.

    >
    > What error class or other approach do you recommend?


    Unless you have a good reason for doing something different, do what
    Python built-ins do:

    >>> int('123', parrot=16)

    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    TypeError: 'parrot' is an invalid keyword argument for this function


    >> I also should point out that your trick will fail if you are using
    >> __slots__.

    > ??. Will research that. Elaborate if you wish.


    __slots__ are an optimization for making objects smaller than normal if
    you have many millions of them:

    http://docs.python.org/reference/datamodel.html#slots


    > If the class grows - and I expect it will - I'd prefer to stick with
    > the keywords approach. That approach also allows me to use a
    > dictionary to initialize the object.


    You can still do that with named parameters.


    >>> class Parrot:

    .... def __init__(self, name='Polly', colour='blue',
    .... breed='Norwegian'):
    .... self.name = name
    .... self.colour = colour
    .... self.breed = breed
    .... def speak(self):
    .... print "%s the %s %s says 'Give us a kiss!'" % (
    .... self.name, self.colour, self.breed)
    ....
    >>> p = Parrot("Sparky", 'white', "Cockatoo")
    >>> p.speak()

    Sparky the white Cockatoo says 'Give us a kiss!'
    >>>
    >>> data = dict(colour='red', name='Fred', foo=1)
    >>> p = Parrot(**data) # raise an error with bad input

    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    TypeError: __init__() got an unexpected keyword argument 'foo'
    >>>
    >>> del data['foo'] # fix the bad input
    >>> p = Parrot(**data)
    >>> p.speak()

    Fred the red Norwegian says 'Give us a kiss!'


    --
    Steven
    Steven D'Aprano, Oct 31, 2009
    #5
  6. On Friday, 30 October 2009 17:28:47 MRAB wrote:

    > Wouldn't it be clearer if they were called dromedaryCase and
    > BactrianCase? :)


    Ogden Nash:

    The Camel has a single hump-
    The Dromedary, two;
    Or the other way around-
    I'm never sure. - Are You?

    - Hendrik
    Hendrik van Rooyen, Oct 31, 2009
    #6
  7. Steven D'Aprano

    MRAB Guest

    Hendrik van Rooyen wrote:
    > On Friday, 30 October 2009 17:28:47 MRAB wrote:
    >
    >> Wouldn't it be clearer if they were called dromedaryCase and
    >> BactrianCase? :)

    >
    > Ogden Nash:
    >
    > The Camel has a single hump-
    > The Dromedary, two;
    > Or the other way around-
    > I'm never sure. - Are You?
    >

    If you make the first letter a capital:

    Dromedary starts with "D", 1 bump, 1 hump.

    Bactrian starts with "B", 2 bumps, 2 humps.
    MRAB, Oct 31, 2009
    #7
  8. On Sat, 31 Oct 2009 11:15:48 -0500, Tim Johnson wrote:

    > Many programmers I know stay away from 'lists' such as this, because
    > they are afraid to show their ignorance. Me, I'm fearless, and I have
    > learned a lot that I might not have otherwise.


    The only stupid question is the one you are afraid to ask.

    Good luck!


    --
    Steven
    Steven D'Aprano, Nov 1, 2009
    #8
  9. Steven D'Aprano

    Aahz Guest

    In article <02fd0c85$0$1326$>,
    Steven D'Aprano <> wrote:
    >On Sat, 31 Oct 2009 11:15:48 -0500, Tim Johnson wrote:
    >>
    >> Many programmers I know stay away from 'lists' such as this, because
    >> they are afraid to show their ignorance. Me, I'm fearless, and I have
    >> learned a lot that I might not have otherwise.

    >
    >The only stupid question is the one you are afraid to ask.


    "There are no stupid questions, only stupid people."
    --
    Aahz () <*> http://www.pythoncraft.com/

    [on old computer technologies and programmers] "Fancy tail fins on a
    brand new '59 Cadillac didn't mean throwing out a whole generation of
    mechanics who started with model As." --Andrew Dalke
    Aahz, Nov 3, 2009
    #9
  10. 2009/11/1 Steven D'Aprano <>:
    >
    > The only stupid question is the one you are afraid to ask.


    I was once asked, and I quote exactly, "are there any fish in the Atlantic sea?"

    That's pretty stupid. ;-)

    --
    Cheers,
    Simon B.
    Simon Brunning, Nov 3, 2009
    #10
  11. Steven D'Aprano

    Ethan Furman Guest

    Simon Brunning wrote:
    > 2009/11/1 Steven D'Aprano <>:
    >
    >>The only stupid question is the one you are afraid to ask.

    >
    >
    > I was once asked, and I quote exactly, "are there any fish in the Atlantic sea?"
    >
    > That's pretty stupid. ;-)
    >


    Are there any fish in the Dead Sea?

    ~Ethan~
    Ethan Furman, Nov 3, 2009
    #11
  12. On Tue, 03 Nov 2009 09:59:32 -0800, Ethan Furman <>
    wrote:

    > Simon Brunning wrote:
    >> 2009/11/1 Steven D'Aprano <>:
    >>
    >>> The only stupid question is the one you are afraid to ask.

    >> I was once asked, and I quote exactly, "are there any fish in the
    >> Atlantic sea?"
    >> That's pretty stupid. ;-)
    >>

    >
    > Are there any fish in the Dead Sea?
    >


    Depends on how you define fish, surely ;-)?



    --
    Rami Chowdhury
    "Never attribute to malice that which can be attributed to stupidity" --
    Hanlon's Razor
    408-597-7068 (US) / 07875-841-046 (UK) / 0189-245544 (BD)
    Rami Chowdhury, Nov 3, 2009
    #12
  13. On Tue, 03 Nov 2009 11:26:49 +0000, Simon Brunning wrote:

    > 2009/11/1 Steven D'Aprano <>:
    >>
    >> The only stupid question is the one you are afraid to ask.

    >
    > I was once asked, and I quote exactly, "are there any fish in the
    > Atlantic sea?"
    >
    > That's pretty stupid. ;-)


    Once in the distant past, there were no fish in what would become the
    Atlantic Ocean (not sea); and some day in the future there won't be any
    fish either. At the rate we're going that day may not be that far away:
    fish are being over-fished all over the world, jellyfish are blooming,
    and there are areas of the Namibian continental where the dominant
    species have flipped from fish to jellyfish:

    http://www.scienceinafrica.co.za/2009/september/jellyfish.htm
    http://www.sciencedaily.com/releases/2006/07/060711091411.htm
    http://www.sciencedaily.com/releases/2009/06/090609092057.htm


    So, no, not a stupid question at all.



    --
    Steven
    Steven D'Aprano, Nov 4, 2009
    #13
  14. On Tue, 3 Nov 2009 11:26:49 +0000, Simon Brunning
    <> declaimed the following in
    gmane.comp.python.general:

    > I was once asked, and I quote exactly, "are there any fish in the Atlantic sea?"
    >
    > That's pretty stupid. ;-)
    >

    Perfectly valid answer -- there are no fish as there is no Atlantic
    sea <G>
    --
    Wulfraed Dennis Lee Bieber KD6MOG
    HTTP://wlfraed.home.netcom.com/
    Dennis Lee Bieber, Nov 4, 2009
    #14
  15. Steven D'Aprano

    Ethan Furman Guest

    Dennis Lee Bieber wrote:
    > Perfectly valid answer -- there are no fish as there is no
    > Atlantic sea <G>



    Steven D'Aprano wrote:
    > Once in the distant past, there were no fish in what would become the
    > Atlantic Ocean (not sea)


    What's with the bias against the word 'sea'?

    sea
    –noun
    1. the salt waters that cover the greater part of the earth's surface.
    2. a division of these waters, of considerable extent, more or less
    definitely marked off by land boundaries: the North Sea.
    3. one of the seven seas; ocean.

    I'd say the Atlantic qualifies! ;-)

    ~Ethan~
    Ethan Furman, Nov 4, 2009
    #15
  16. On Wed, 04 Nov 2009 06:36:46 -0800, Ethan Furman <>
    declaimed the following in gmane.comp.python.general:


    > What's with the bias against the word 'sea'?
    >
    > sea
    > –noun
    > 1. the salt waters that cover the greater part of the earth's surface.
    > 2. a division of these waters, of considerable extent, more or less
    > definitely marked off by land boundaries: the North Sea.
    > 3. one of the seven seas; ocean.
    >

    In the usages to which I'm accustomed, the Atlantic has always been
    "ocean" (two of them: North and South)

    "Seas" seemed slightly more land-locked: Black, Caspian, Red,
    Baltic, Caribbean, North, Mediterranean -- except for that floating mass
    of seaweed: the Sargasso Sea

    --
    Wulfraed Dennis Lee Bieber KD6MOG
    HTTP://wlfraed.home.netcom.com/
    Dennis Lee Bieber, Nov 4, 2009
    #16
  17. On Wed, 04 Nov 2009 06:36:46 -0800, Ethan Furman wrote:

    > Dennis Lee Bieber wrote:
    > > Perfectly valid answer -- there are no fish as there is no Atlantic
    > > sea <G>

    >
    >
    > Steven D'Aprano wrote:
    > > Once in the distant past, there were no fish in what would become the
    > > Atlantic Ocean (not sea)

    >
    > What's with the bias against the word 'sea'?


    The Atlantic Ocean is named the Atlantic Ocean, not the Atlantic Lake or
    Atlantic Puddle or Atlantic Dewdrop or Atlantic Sea.

    Otherwise, sea is a perfectly good word, for describing what the Atlantic
    Ocean *is* rather than what it is *named*.



    --
    Steven
    Steven D'Aprano, Nov 4, 2009
    #17
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Derek Fountain

    When is a __dict__ not a __dict__?

    Derek Fountain, Apr 21, 2004, in forum: Python
    Replies:
    1
    Views:
    323
    John Roth
    Apr 21, 2004
  2. Ralf W. Grosse-Kunstleve
    Replies:
    16
    Views:
    561
    Lonnie Princehouse
    Jul 11, 2005
  3. Ralf W. Grosse-Kunstleve
    Replies:
    18
    Views:
    580
    Bengt Richter
    Jul 11, 2005
  4. Ralf W. Grosse-Kunstleve
    Replies:
    2
    Views:
    390
    Dan Sommers
    Jul 12, 2005
  5. falcon
    Replies:
    0
    Views:
    361
    falcon
    Jul 31, 2005
Loading...

Share This Page