dynamic setattr

Mariano Di Felice mariano.difelice at gmail.com
Fri Jul 27 15:59:55 CEST 2012


Hi Steven,
  Sorry for inconvenients.
I've posted "unsyntax" example just typing from here, just for exaplain my problem

Finally, I don't understand why every set_<key> set value on wrong section/key.
I think setattr syntax is correct, but it doesn't works!

About java/python concept, yeah! You all right!
But I need a conversion class (as Utility) that expose getter/setter of any keys.

Thx!

Il giorno venerdì 27 luglio 2012 15:46:59 UTC+2, Steven D'Aprano ha scritto:
> On Fri, 27 Jul 2012 05:49:45 -0700, Mariano Di Felice wrote:
> 
> > Hi,
> >   I have a property file (.ini) that has multiple sections and relative
> >   keys, as default structure.
> 
> Have you looked at Python's standard INI file library?

I already use it!

> 
> http://docs.python.org/library/configparser.html
> 
> 
> > Now, I would like to export from my utility class methods getter and
> > setter. I have started as is:
> > 
> > class Utility:
> > 
> >   keys = {"STANDUP": ["st_key1", "st_key2", "st_key3", "st_key4"],
> >               "DEFAULT": ["def_key1", "def_key2", "def_key3",
> >               "def_key4", "def_key5"]}
> 
> This defines a *shared* class attribute. As it is attached to the class, 
> not an instance, every instance will see the same shared dict.
> 
> 
> >   def __init__(self):
> >             for section, keyList in  keys .items(): 
> >             for key in keyList:
> 
> As given, this is a SyntaxError. Please do not retype your code from 
> memory, always COPY AND PASTE your actual code.
> 
> In this case, it is easy to fix the syntax error by fixing the 
> indentation. But what other changes have you made by accident?
> 
> Your code:
> 
>     def __init__(self):
>         for section, keyList in  keys .items(): 
> 
> looks for a *global variable* called keys, *not* the shared class 
> attribute Utility.keys. By design, attributes are not in the function 
> scope. If you want to access an attribute, whether class or instance, you 
> must always refer to them as attributes.
> 
> 
>     def __init__(self):
>         for section, keyList in  self.keys.items():  # this will work
> 
> 
> >                 setattr(self, "get_%s" % key, self.get_value(section,
> >                 key)) 
> >                 setattr(self, "set_%s" % key, lambda
> >                 value:self.set_value(section, key, value) )
> 
> 
> What a mess. What is the purpose of this jumble of code?
> 
> My guess is that you are experienced with Java, and you are trying to 
> adapt Java idioms and patterns to Python. Before you do this, you should 
> read these two articles by a top Python developer who also knows Java 
> backwards:
> 
> http://dirtsimple.org/2004/12/python-is-not-java.html
> http://dirtsimple.org/2004/12/java-is-not-python-either.html
> 
> 
> 
> > if __name__ == "__main__":
> >    utility = Utility()
> >      print "key2: %s" % utility.get_def_key2() ## -> value return 100
> 
> Again, another SyntaxError. This can be fixed. But the next part cannot.
> 
> Except for two comments, 100 does not exist in your sample code. Python 
> doesn't magically set values to 100. The code you give cannot possibly 
> return 100 since nowhere in your code does it set anything to 100.
> 
> If you actually run the code you provide (after fixing the SyntaxErrors), 
> you get this error:
> 
> py> utility = Utility()
> Traceback (most recent call last):
>   File "<stdin>", line 1, in <module>
>   File "<stdin>", line 5, in __init__
> NameError: global name 'keys' is not defined
> 
> 
> If you fix that and try again, you get this error:
> 
> py> utility = Utility()
> Traceback (most recent call last):
>   File "<stdin>", line 1, in <module>
>   File "<stdin>", line 7, in __init__
> TypeError: get_value() takes exactly 2 arguments (3 given)
> 
> 
> The results you claim you get are not true.
> 
> 
> Please read this page and then try again:
> 
> http://sscce.org/
> 
> 
> 
> -- 
> Steven




More information about the Python-list mailing list