getattr/setattr q.

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Paulo da Silva

    #1

    getattr/setattr q.

    Hi!

    In a class C, I may do setattr(C,'x',1 0).

    Is it possible to use getattr/setattr for variables not inside
    classes or something equivalent? I mean with the same result as
    exec("x=10").

    Thanks.
  • Steven Bethard

    #2
    Re: getattr/setattr q.

    Paulo da Silva wrote:
    In a class C, I may do setattr(C,'x',1 0).
    >
    Is it possible to use getattr/setattr for variables not inside
    classes or something equivalent? I mean with the same result as
    exec("x=10").
    If you're at the module level, you can do::

    globals()['x'] = 10

    If you're inside a function, you probably want to look for another way
    of doing what you're doing.

    What's the actual task you're trying to accomplish here?

    STeVe

    Comment

    • Ben Finney

      #3
      Re: getattr/setattr q.

      Paulo da Silva <psdasilvaX@eso tericaX.ptXwrit es:
      In a class C, I may do setattr(C,'x',1 0).
      That would set an attribute on the class C, shared by all instances of
      that class.

      If you want to set an attribute on an instance, you need to do so on
      the instance object::
      >>class Foo(object):
      ... def __init__(self):
      ... setattr(self, 'bar', 10)
      ...
      >>Foo.bar
      Traceback (most recent call last):
      File "<stdin>", line 1, in ?
      AttributeError: type object 'Foo' has no attribute 'bar'
      >>spam = Foo()
      >>spam.bar
      10
      Is it possible to use getattr/setattr for variables not inside
      classes or something equivalent? I mean with the same result as
      exec("x=10").
      "Variables not inside classes or functions" are attributes of the
      module (so-called "global" attributes). Thus, you can use setattr on
      the module object::
      >>import sys
      >>def foo():
      ... this_module = sys.modules[__name__]
      ... setattr(this_mo dule, 'bar', 10)
      ...
      >>bar
      Traceback (most recent call last):
      File "<stdin>", line 1, in ?
      NameError: name 'bar' is not defined
      >>foo()
      >>bar
      10

      --
      \ "I'm beginning to think that life is just one long Yoko Ono |
      `\ album; no rhyme or reason, just a lot of incoherent shrieks and |
      _o__) then it's over." -- Ian Wolff |
      Ben Finney

      Comment

      • 7stud

        #4
        Re: getattr/setattr q.

        On Apr 2, 10:08 pm, Paulo da Silva <psdasil...@eso tericaX.ptXwrot e:
        Is it possible to use getattr/setattr for variables not inside
        classes...?
        What does the python documentation say about the definition of
        setattr()?

        Comment

        • Steven D'Aprano

          #5
          Re: getattr/setattr q.

          On Tue, 03 Apr 2007 05:08:42 +0100, Paulo da Silva wrote:
          Hi!
          >
          In a class C, I may do setattr(C,'x',1 0).
          >
          Is it possible to use getattr/setattr for variables not inside
          classes or something equivalent? I mean with the same result as
          exec("x=10").
          Yes, but you shouldn't unless you really need to. You're better off
          rethinking your algorithm.

          If you think you really need to, you probably don't.

          If you *really* think you really need to, you might.

          >>x
          Traceback (most recent call last):
          File "<stdin>", line 1, in ?
          NameError: name 'x' is not defined
          >>globals()['x'] = 5
          >>x
          5


          Note that there is also a function locals(), but it doesn't work as you
          might expect:

          >>def f():
          .... locals()['x'] = 99
          .... print x
          ....
          >>f()
          5



          --
          Steven D'Aprano

          Comment

          • Paulo da Silva

            #6
            Re: getattr/setattr q.

            7stud escreveu:
            On Apr 2, 10:08 pm, Paulo da Silva <psdasil...@eso tericaX.ptXwrot e:
            >Is it possible to use getattr/setattr for variables not inside
            >classes...?
            >
            What does the python documentation say about the definition of
            setattr()?
            >
            I didn't read the full python documentation, yet! I hope to survive
            until then :-)
            In the meanwhile, I searched google for setattr python but all
            references I could see were about X.foo type.

            One more "RTFM culture" response ...

            Thanks.
            Paulo

            Comment

            • Paulo da Silva

              #7
              Re: getattr/setattr q.

              Steven Bethard escreveu:
              Paulo da Silva wrote:
              ....
              If you're at the module level, you can do::
              >
              globals()['x'] = 10
              >
              If you're inside a function, you probably want to look for another way
              of doing what you're doing.
              >
              What's the actual task you're trying to accomplish here?

              None. I asked just for curiosity. My problem has to do with the normal
              case of a class or class instance. When I saw setattr/getattr as the way
              to solve my problem I just felt curiosity on if and how it could be done
              outside a class.

              Thank you very much for your response.
              Paulo

              Comment

              • Steve Holden

                #8
                Re: getattr/setattr q.

                Paulo da Silva wrote:
                Steven Bethard escreveu:
                >Paulo da Silva wrote:
                ...
                >
                >If you're at the module level, you can do::
                >>
                > globals()['x'] = 10
                >>
                >If you're inside a function, you probably want to look for another way
                >of doing what you're doing.
                >>
                >What's the actual task you're trying to accomplish here?
                >
                >
                None. I asked just for curiosity. My problem has to do with the normal
                case of a class or class instance. When I saw setattr/getattr as the way
                to solve my problem I just felt curiosity on if and how it could be done
                outside a class.
                >
                Thank you very much for your response.
                Paulo
                You don't need setattr/getattr if you know in advance the name of the
                attribute you need to access and you can get a reference to the object
                whose attribute it is. So:
                >>import sys
                >>x = "Hello, Paulo"
                >>sys.modules['__main__'].x
                'Hello, Paulo'
                >>globals()['x']
                'Hello, Paulo'
                >>>
                regards
                Steve
                --
                Steve Holden +44 150 684 7255 +1 800 494 3119
                Holden Web LLC/Ltd http://www.holdenweb.com
                Skype: holdenweb http://del.icio.us/steve.holden
                Recent Ramblings http://holdenweb.blogspot.com

                Comment

                • Steven Bethard

                  #9
                  Re: getattr/setattr q.

                  Steve Holden wrote:
                  You don't need setattr/getattr if you know in advance the name of the
                  attribute you need to access and you can get a reference to the object
                  whose attribute it is. So:
                  >
                  >>x = "Hello, Paulo"
                  >>import sys
                  >>sys.modules['__main__'].x
                  'Hello, Paulo'
                  a.k.a
                  >>import __main__
                  >>__main__.x
                  'Hello, Paulo'

                  STeVe

                  Comment

                  • Steve Holden

                    #10
                    Re: getattr/setattr q.

                    Steven Bethard wrote:
                    Steve Holden wrote:
                    >You don't need setattr/getattr if you know in advance the name of the
                    >attribute you need to access and you can get a reference to the object
                    >whose attribute it is. So:
                    >>
                    > >>x = "Hello, Paulo"
                    > >>import sys
                    > >>sys.modules['__main__'].x
                    >'Hello, Paulo'
                    >
                    a.k.a
                    >
                    >>import __main__
                    >>__main__.x
                    'Hello, Paulo'
                    >
                    Indeed. Any handle on the right object will do.

                    regards
                    Steve
                    --
                    Steve Holden +44 150 684 7255 +1 800 494 3119
                    Holden Web LLC/Ltd http://www.holdenweb.com
                    Skype: holdenweb http://del.icio.us/steve.holden
                    Recent Ramblings http://holdenweb.blogspot.com

                    Comment

                    • Paulo da Silva

                      #11
                      Re: getattr/setattr q.

                      Yes, but you shouldn't unless you really need to. You're better off
                      rethinking your algorithm.

                      I need it but inside a class. The idea is to pass an instance of a class
                      (think of something like a record but with some methods inside) with
                      "fields", whose names are not known in advance, to another class that
                      must handle those "fields" at the caller request given their names as
                      parameter strings.

                      Another use I am thinking of is in a xml driven program where some
                      parameters "foo=bar", read as strings, must be converted into internal
                      variables xxx_foo=bar. I have written a 1st draft using dicts but this
                      way it is much easier and readable.


                      Regards
                      Paulo

                      Comment

                      Working...