extended setattr()

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Rotlaus

    extended setattr()

    2 weeks ago i asked for a etended getattr() which worked really fine,
    but now i would love to have a extended setattr() as well.

    Lets assume i have some classes:

    class A(object):
    def __init__(self):
    self.B = B()

    class B(object):
    def __init__(self):
    self.C = C()

    class C(object):
    def __init__(self, foo='', bar=''):
    self.foo = foo
    self.bar = bar

    and now i wanna do something like this:

    a=A()
    ext_setattr(a, 'B.C', ('a', 'b'))

    Is this possible? It would also be nice if the attributes would be
    created if they not exist, always implying that
    objectname==obj ecttype.

    Kind regards,

    Andre
  • Rotlaus

    #2
    Re: extended setattr()

    On 7 Jul., 08:01, Rotlaus <rotl...@gmail. comwrote:
    2 weeks ago i asked for a etended getattr() which worked really fine,
    but now i would love to have a extendedsetattr () as well.
    I've tried the following, but it doesn't work:

    class A(object):
    def __init__(self):
    self.B = B()

    class B(object):
    def __init__(self):
    self.C = C('foo')

    class C(object):
    def __init__(self, txt=''):
    self.txt = txt

    def ext_setattr(obj , attr, val):
    for subattr in attr.split(".") :
    obj = getattr(obj, subattr)
    obj = val
    >>import test
    >>a = A()
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    NameError: name 'A' is not defined
    >>a = test.A()
    >>a.B.C.txt
    'foo'
    >>ext_setattr(a , 'B.C.txt', 'bar')
    >>a.B.C.txt
    'foo'

    What am i doing wrong?

    Comment

    • Diez B. Roggisch

      #3
      Re: extended setattr()

      Rotlaus schrieb:
      On 7 Jul., 08:01, Rotlaus <rotl...@gmail. comwrote:
      >2 weeks ago i asked for a etended getattr() which worked really fine,
      >but now i would love to have a extendedsetattr () as well.
      >
      I've tried the following, but it doesn't work:
      >
      class A(object):
      def __init__(self):
      self.B = B()
      >
      class B(object):
      def __init__(self):
      self.C = C('foo')
      >
      class C(object):
      def __init__(self, txt=''):
      self.txt = txt
      >
      def ext_setattr(obj , attr, val):
      for subattr in attr.split(".") :
      obj = getattr(obj, subattr)
      obj = val
      >
      >>>import test
      >>>a = A()
      Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      NameError: name 'A' is not defined
      >>>a = test.A()
      >>>a.B.C.txt
      'foo'
      >>>ext_setattr( a, 'B.C.txt', 'bar')
      >>>a.B.C.txt
      'foo'
      >
      What am i doing wrong?
      obj = val won't work.

      You need to use a setattr(obj, name, val)

      on the last attribute-name.

      Diez

      Comment

      • Andre Adrian

        #4
        Re: extended setattr()

        Diez B. Roggisch <deets <atnospam.web.d ewrites:
        def ext_setattr(obj , attr, val):
        for subattr in attr.split(".") :
        obj = getattr(obj, subattr)
        obj = val
        >>import test
        >>a = A()
        Traceback (most recent call last):
        File "<stdin>", line 1, in <module>
        NameError: name 'A' is not defined
        >>a = test.A()
        >>a.B.C.txt
        'foo'
        >>ext_setattr(a , 'B.C.txt', 'bar')
        >>a.B.C.txt
        'foo'

        What am i doing wrong?
        >
        obj = val won't work.
        Why is this so? Shouldn't it be the same?
        You need to use a setattr(obj, name, val)
        on the last attribute-name.
        Ok, so this works:

        def ext_setattr(obj , attr, val):
        attributes = attr.split('.')
        for subattr in attributes[:-1]:
        obj = getattr(obj, subattr)
        setattr(obj, attributes[-1], val)


        Comment

        • Diez B. Roggisch

          #5
          Re: extended setattr()

          Andre Adrian wrote:
          Diez B. Roggisch <deets <atnospam.web.d ewrites:
          >
          def ext_setattr(obj , attr, val):
          for subattr in attr.split(".") :
          obj = getattr(obj, subattr)
          obj = val
          >
          >>>import test
          >>>a = A()
          Traceback (most recent call last):
          File "<stdin>", line 1, in <module>
          NameError: name 'A' is not defined
          >>>a = test.A()
          >>>a.B.C.txt
          'foo'
          >>>ext_setattr( a, 'B.C.txt', 'bar')
          >>>a.B.C.txt
          'foo'
          >
          What am i doing wrong?
          >>
          >obj = val won't work.
          >
          Why is this so? Shouldn't it be the same?
          No, of course not!

          obj = val

          binds the object reffered to by val to the LOCAL name obj. That's python
          101, make sure you get variables/names and scopes proper.
          >You need to use a setattr(obj, name, val)
          >on the last attribute-name.
          >
          Ok, so this works:
          >
          def ext_setattr(obj , attr, val):
          attributes = attr.split('.')
          for subattr in attributes[:-1]:
          obj = getattr(obj, subattr)
          setattr(obj, attributes[-1], val)
          Yep.

          Diez

          Comment

          Working...