obj.xyz <> obj['xyz']

classic Classic list List threaded Threaded
11 messages Options
Reply | Threaded
Open this post in threaded view
|

obj.xyz <> obj['xyz']

Roland M. Kruggel-2
hallo liste,

ich habe folgenden classe geschrieben

<code>
class Ob(object):
    def __init__(self, dic):
        for i in dic.keys():
            setattr(self, i , dic[i])
    def __repr__(self):
        return str(self.__dict__)
    def __getitem__(self, key):
        return self.__dict__.get(key,None)
    def __setitem__(self, key, value):
        setattr(self, key, value)
    def __delitem__(self, key):
        del self.__dict__[key]
    def __len__(self):
        return len(self.__dict__)
    def __iter__(self):
        return self.__dict__.iterkeys()
    def keys(self):
        return self.__dict__.keys()
    def has_key(self, key):
        return self.__dict__.has_key(key)
</code>

aufrufen tue ich das ganze mit
xy = Ob({'aa':'a1', 'bb':'b1'})

ich kann somit xy['aa'] nutzen als auch xy.aa. Es funktioniert auch.

aber:
Wenn ich auf eine undefinierte variable zugreife "xy['undef']" bekomme
ich, wie gewollt, ein None zurück. Jedoch ein "xx.undef" erzeugt den
fehler

Traceback (most recent call last):
  File "<string>", line 1, in <string>
AttributeError: 'Ob' object has no attribute 'undef'

Ein "xx.undef" ruft wohl nicht __getitem__ auf. Wie kann ich das
lösen?





--
cu
 Roland M. Kruggel

mailto:[hidden email]     http:www.bbf7.de
System: Intel, Debian etch, 2.6.21, xfce4, KDE 3.5

------------
Zufallszitat
Wie man sein Kind nicht nennen sollte:
  Ron Dell

_______________________________________________
python-de maillist  -  [hidden email]
http://python.net/mailman/listinfo/python-de
Reply | Threaded
Open this post in threaded view
|

Re: obj.xyz <> obj['xyz']

Andreas Jung


--On 21. Dezember 2007 14:01:35 +0100 "Roland M. Kruggel"
<[hidden email]> wrote:

> hallo liste,
>
> ich habe folgenden classe geschrieben
>
> <code>
> class Ob(object):
>     def __init__(self, dic):
>         for i in dic.keys():
>             setattr(self, i , dic[i])
>     def __repr__(self):
>         return str(self.__dict__)
>     def __getitem__(self, key):
>         return self.__dict__.get(key,None)
>     def __setitem__(self, key, value):
>         setattr(self, key, value)
>     def __delitem__(self, key):
>         del self.__dict__[key]
>     def __len__(self):
>         return len(self.__dict__)
>     def __iter__(self):
>         return self.__dict__.iterkeys()
>     def keys(self):
>         return self.__dict__.keys()
>     def has_key(self, key):
>         return self.__dict__.has_key(key)
> </code>
>
> aufrufen tue ich das ganze mit
> xy = Ob({'aa':'a1', 'bb':'b1'})
>
> ich kann somit xy['aa'] nutzen als auch xy.aa. Es funktioniert auch.
>
> aber:
> Wenn ich auf eine undefinierte variable zugreife "xy['undef']" bekomme
> ich, wie gewollt, ein None zurück. Jedoch ein "xx.undef" erzeugt den
> fehler
>
> Traceback (most recent call last):
>   File "<string>", line 1, in <string>
> AttributeError: 'Ob' object has no attribute 'undef'
>
> Ein "xx.undef" ruft wohl nicht __getitem__ auf. Wie kann ich das
> lösen?
Dokumentation lesen: __getattr__() wird hier aufgerufen, nicht
__getitem__().

-aj

_______________________________________________
python-de maillist  -  [hidden email]
http://python.net/mailman/listinfo/python-de

attachment0 (193 bytes) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: obj.xyz <> obj['xyz']

Jochen Spieker
In reply to this post by Roland M. Kruggel-2
Roland M. Kruggel:
>
> Traceback (most recent call last):
>   File "<string>", line 1, in <string>
> AttributeError: 'Ob' object has no attribute 'undef'
>
> Ein "xx.undef" ruft wohl nicht __getitem__ auf. Wie kann ich das
> lösen?

http://docs.python.org/ref/attribute-access.html

Attributzugriff ist etwas anderes, als die Containeremulation.

(Nebenbei erlaube ich mir auch zu erwähnen, dass ich das Ganze etwas
 fragwürdig finde, aber egal. :))

J.
--
I throw away plastics and think about the discoveries of future
archeologists.
[Agree]   [Disagree]
                 <http://www.slowlydownward.com/NODATA/data_enter2.html>

_______________________________________________
python-de maillist  -  [hidden email]
http://python.net/mailman/listinfo/python-de

signature.asc (196 bytes) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: obj.xyz <> obj['xyz']

Roland M. Kruggel-2
In reply to this post by Andreas Jung
> >
> > Ein "xx.undef" ruft wohl nicht __getitem__ auf. Wie kann ich das
> > lösen?
>
> Dokumentation lesen: __getattr__() wird hier aufgerufen, nicht
> __getitem__().

agrrr.
thnx. funktioniert.


--
cu
 Roland M. Kruggel

mailto:[hidden email]     http:www.bbf7.de
System: Intel, Debian etch, 2.6.21, xfce4, KDE 3.5

------------
Zufallszitat
... ich höre nachts die Lokomotiven pfeifen, sehnsüchtig schreit die
Ferne, und ich drehe mich im Bett herum und denke: 'Reisen...'
                -- Kurt Tucholsky

_______________________________________________
python-de maillist  -  [hidden email]
http://python.net/mailman/listinfo/python-de
Reply | Threaded
Open this post in threaded view
|

Re: obj.xyz <> obj['xyz']

Roland M. Kruggel-2
In reply to this post by Jochen Spieker
Am Freitag, 21. Dezember 2007 schrieb Jochen Schulz:

> Roland M. Kruggel:
> > Traceback (most recent call last):
> >   File "<string>", line 1, in <string>
> > AttributeError: 'Ob' object has no attribute 'undef'
> >
> > Ein "xx.undef" ruft wohl nicht __getitem__ auf. Wie kann ich das
> > lösen?
>
> http://docs.python.org/ref/attribute-access.html
>
> Attributzugriff ist etwas anderes, als die Containeremulation.
>
> (Nebenbei erlaube ich mir auch zu erwähnen, dass ich das Ganze
> etwas fragwürdig finde, aber egal. :))

Warum? Würde ich gerne wissen. (Ist MIR nicht egal :))
Ich lerne immer gern Neues hinzu



--
cu
 Roland M. Kruggel

mailto:[hidden email]     http:www.bbf7.de
System: Intel, Debian etch, 2.6.21, xfce4, KDE 3.5

------------
Zufallszitat
   Wie wollte einer als Meister in seinem Fach erscheinen, wenn er
nichts Unnützes lehrte!
                -- Goethe, Maximen und Reflektionen, Nr. 901

_______________________________________________
python-de maillist  -  [hidden email]
http://python.net/mailman/listinfo/python-de
Reply | Threaded
Open this post in threaded view
|

Re: obj.xyz <> obj['xyz']

Jochen Spieker
Roland M. Kruggel:
> Am Freitag, 21. Dezember 2007 schrieb Jochen Schulz:
>>
>> Attributzugriff ist etwas anderes, als die Containeremulation.
>>
>> (Nebenbei erlaube ich mir auch zu erwähnen, dass ich das Ganze
>> etwas fragwürdig finde, aber egal. :))
>
> Warum? Würde ich gerne wissen. (Ist MIR nicht egal :))

Was Du da machst ist eine nette Spielerei, anhand der man einiges über
Python lernen kann. Ich sehe aber keinen praktischen Nutzen. Dazu kommt,
dass Du still und leise Exceptions verschluckst. Das *kann* man wollen,
aber in den meisten Fällen will man schon wissen, ob man sich bei einem
Attribut einfach vertippt hat, oder ob es wirklich auf None gesetzt
wurde.

J.
--
In this bunker there are women and children. There are no weapons.
[Agree]   [Disagree]
                 <http://www.slowlydownward.com/NODATA/data_enter2.html>

_______________________________________________
python-de maillist  -  [hidden email]
http://python.net/mailman/listinfo/python-de

signature.asc (196 bytes) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: obj.xyz <> obj['xyz']

Andreas Jung


--On 25. Dezember 2007 23:06:54 +0100 Jochen Schulz <[hidden email]>
wrote:

> Roland M. Kruggel:
>> Am Freitag, 21. Dezember 2007 schrieb Jochen Schulz:
>>>
>>> Attributzugriff ist etwas anderes, als die Containeremulation.
>>>
>>> (Nebenbei erlaube ich mir auch zu erwähnen, dass ich das Ganze
>>> etwas fragwürdig finde, aber egal. :))
>>
>> Warum? Würde ich gerne wissen. (Ist MIR nicht egal :))
>
> Was Du da machst ist eine nette Spielerei, anhand der man einiges über
> Python lernen kann. Ich sehe aber keinen praktischen Nutzen.
Es gibt durchaus einen Nutzen für einen solchen Ansatz...allerdings
ist die Implementierung einfach schrottig.

Andreas
_______________________________________________
python-de maillist  -  [hidden email]
http://python.net/mailman/listinfo/python-de

attachment0 (193 bytes) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: obj.xyz <> obj['xyz']

Roland M. Kruggel-2
> >> Warum? Würde ich gerne wissen. (Ist MIR nicht egal :))
> >
> > Was Du da machst ist eine nette Spielerei, anhand der man einiges
> > über Python lernen kann. Ich sehe aber keinen praktischen Nutzen.
>
> Es gibt durchaus einen Nutzen für einen solchen Ansatz...allerdings
> ist die Implementierung einfach schrottig.

Das waren meine ersten Gehversuche dieser Art. Wie mache ich es
Besser?

--
cu
 Roland M. Kruggel

mailto:[hidden email]     http:www.bbf7.de
System: Intel, Debian etch, 2.6.21, xfce4, KDE 3.5

------------
Zufallszitat
An einem kleinen Muster können wir oft das ganze Stück beurteilen.
                -- Miguel de Cervantes

_______________________________________________
python-de maillist  -  [hidden email]
http://python.net/mailman/listinfo/python-de
Reply | Threaded
Open this post in threaded view
|

Re: obj.xyz <> obj['xyz']

Andreas Jung


--On 26. Dezember 2007 14:36:43 +0100 "Roland M. Kruggel"
<[hidden email]> wrote:

>> >> Warum? Würde ich gerne wissen. (Ist MIR nicht egal :))
>> >
>> > Was Du da machst ist eine nette Spielerei, anhand der man einiges
>> > über Python lernen kann. Ich sehe aber keinen praktischen Nutzen.
>>
>> Es gibt durchaus einen Nutzen für einen solchen Ansatz...allerdings
>> ist die Implementierung einfach schrottig.
>
> Das waren meine ersten Gehversuche dieser Art. Wie mache ich es
> Besser?
>
> -
Wahrscheinlich würde ich nur __getitem__() und __setitem__()
überschreiben und dort direkt self.__dict__ manipulieren bzw. auslesen.
Das erspart zumindest die Manipulation von __getattr__() und __setattr__().
Insb. muß man hier aufpassen, dass man AttributeError richtig
handhabt..sonst programmiert man sich schnell ein Disaster zusammen.

Andreas
_______________________________________________
python-de maillist  -  [hidden email]
http://python.net/mailman/listinfo/python-de

attachment0 (193 bytes) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: obj.xyz <> obj['xyz']

"Martin v. Löwis"
> Wahrscheinlich würde ich nur __getitem__() und __setitem__()
> überschreiben und dort direkt self.__dict__ manipulieren bzw. auslesen.

Dann wird aber foo.bar nicht None, wenn foo.__dict__ nicht 'bar' hat;
das wollte der OP aber so.

Außerdem kann man dann nicht über das Objekt iterieren.

Ich finde die Implementierung korrekt (auch wenn nicht das ganze
Dictionary-Protokoll implementiert wird).

Ciao,
Martin

_______________________________________________
python-de maillist  -  [hidden email]
http://python.net/mailman/listinfo/python-de
Reply | Threaded
Open this post in threaded view
|

Re: obj.xyz <> obj['xyz']

"Martin v. Löwis"
In reply to this post by Roland M. Kruggel-2
>> Es gibt durchaus einen Nutzen für einen solchen Ansatz...allerdings
>> ist die Implementierung einfach schrottig.
>
> Das waren meine ersten Gehversuche dieser Art. Wie mache ich es
> Besser?

Wie gesagt - ich finde die Implementierung korrekt. Kürzer wäre es,
von dict abzuleiten und dann nur __getattr__/__setattr__/__delattr__
zu redefinieren.

Problematisch an dem prinzipiellen Ansatz finde ich, dass es immer
Attribute geben wird, die es nicht in der gleichen Form auch als
Schlüssel gibt.

In der ursprünglichen Lösung ist z.B. o.__dict__ ein Dictionary,
aber o['__dict__'] ist None; analog für .__class__

Ciao,
Martin


_______________________________________________
python-de maillist  -  [hidden email]
http://python.net/mailman/listinfo/python-de