monkey patch mit einem egg

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

monkey patch mit einem egg

robert rottermann
Hoi zäme,

ich versuche eine methode einer Klasse die aus einem egg stamm mit einem monkey
pach anzupassen.

das gelingt aber nicht.
Python ist Version 2.4

was ich mache ist folgendes:
from xlwt import *
def adjust_bound_col_idx(self, *args(...)
     meine Anpassungen
     ..
Row.__adjust_bound_col_idx = adjust_bound_col_idx

jedoch wird weiterhin die ursprüngliche methode genutzt.

wenn ich im debugger die Klasse untersuche, hat sie zwei Methoden mit dem Namen
__adjust_bound_col_idx.
Jedenfalls behaupted das die codeinspection von Wing4.

Ist es möglich, dass "semiprivate" methoden die mit __ beginnen nicht gepatcht
werden können?

danke
robert

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

Re: monkey patch mit einem egg

Diez B. Roggisch

Am 27.03.2011 um 12:14 schrieb robert rottermann:

> Hoi zäme,
>
> ich versuche eine methode einer Klasse die aus einem egg stamm mit  
> einem monkey pach anzupassen.
>
> das gelingt aber nicht.
> Python ist Version 2.4
>
> was ich mache ist folgendes:
> from xlwt import *
> def adjust_bound_col_idx(self, *args(...)
>    meine Anpassungen
>    ..
> Row.__adjust_bound_col_idx = adjust_bound_col_idx
>
> jedoch wird weiterhin die ursprüngliche methode genutzt.
>
> wenn ich im debugger die Klasse untersuche, hat sie zwei Methoden  
> mit dem Namen __adjust_bound_col_idx.
> Jedenfalls behaupted das die codeinspection von Wing4.
>
> Ist es möglich, dass "semiprivate" methoden die mit __ beginnen  
> nicht gepatcht werden können?

Doch, bestimmt. Du musst nur den gescopten (scheiss wort) Namen  
benutzen:



class Foo(object):


     def invoke(self):
         self.__protected()


     def __protected(self):
         print "original"


f = Foo()
f.invoke()


def fake(self):
     print "fake"

Foo._Foo__protected = fake

f.invoke()


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

Re: monkey patch mit einem egg

robert rottermann
Am 27.03.2011 13:37, schrieb Diez B. Roggisch:

>
> Am 27.03.2011 um 12:14 schrieb robert rottermann:
>
>> Hoi zäme,
>>
>> ich versuche eine methode einer Klasse die aus einem egg stamm mit einem
>> monkey pach anzupassen.
>>
>> das gelingt aber nicht.
>> Python ist Version 2.4
>>
>> was ich mache ist folgendes:
>> from xlwt import *
>> def adjust_bound_col_idx(self, *args(...)
>>    meine Anpassungen
>>    ..
>> Row.__adjust_bound_col_idx = adjust_bound_col_idx
>>
>> jedoch wird weiterhin die ursprüngliche methode genutzt.
>>
>> wenn ich im debugger die Klasse untersuche, hat sie zwei Methoden mit dem
>> Namen __adjust_bound_col_idx.
>> Jedenfalls behaupted das die codeinspection von Wing4.
>>
>> Ist es möglich, dass "semiprivate" methoden die mit __ beginnen nicht
>> gepatcht werden können?
>
> Doch, bestimmt. Du musst nur den gescopten (scheiss wort) Namen benutzen:
>
>
>
> class Foo(object):
>
>
>     def invoke(self):
>         self.__protected()
>
>
>     def __protected(self):
>         print "original"
>
>
> f = Foo()
> f.invoke()
>
>
> def fake(self):
>     print "fake"
>
> Foo._Foo__protected = fake
>
> f.invoke()
>
>
> Diez
> _______________________________________________
> python-de maillist  -  [hidden email]
> http://python.net/mailman/listinfo/python-de
Diez besten dank,
mit dem komm ich ein Stück weiter. Meine Methode wird nun aufgerufen. Und schon
kommt das nächste Problem.
Die Methode greift auf private Klassenvariabeln zu. Und Python behauptet
stinkfrech, die gäbe es nicht:

     # monkey patch possible colindex > 256
     def adjust_bound_col_idx(self, *args):
         for arg in args:
             iarg = int(arg)
             if not ((0 <= iarg <= 1023) and arg == iarg):
                 raise ValueError("column index (%r) not an int in range(1024)"
% arg)
             sheet = self.__parent <------------------ hier tritt der Fehler auf
             if iarg < self.__min_col_idx:
                 self.__min_col_idx = iarg
             if iarg > self.__max_col_idx:
                 self.__max_col_idx = iarg
             if iarg < sheet.first_used_col:
                 sheet.first_used_col = iarg
             if iarg > sheet.last_used_col:
                 sheet.last_used_col = iarg
     Row._Row__adjust_bound_col_idx = adjust_bound_col_idx

AttributeError: 'Row' object has no attribute '__parent'

ich vermute das liegt auch am verwursten der Variabeln.
Wie muss ich das machen ?

danke
robert

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

Re: monkey patch mit einem egg

Andreas Jung-5
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

robert rottermann wrote:
> Am 27.03.2011 13:37, schrieb Diez B. Roggisch:
>>
>> Am 27.03.2011 um 12:14 schrieb robert rottermann:
>>
>>> Hoi zäme,
>>>
>>> ich versuche eine methode einer Klasse die aus einem egg stamm mit
>>> einem monkey pach anzupassen.

Was 'egg' mit Monkeypatching zu tun. Monkeypatching hat nichts damit
zu tun wie ein Package deployed wurde.

>>>
>>> das gelingt aber nicht.
>>> Python ist Version 2.4
>>>
>>> was ich mache ist folgendes:
>>> from xlwt import *
>>> def adjust_bound_col_idx(self, *args(...)
>>>    meine Anpassungen
>>>    ..
>>> Row.__adjust_bound_col_idx = adjust_bound_col_idx
Die zu überschreibende Methode ist __adjust_bound_col_idx()???

>>>
>>> jedoch wird weiterhin die ursprüngliche methode genutzt.

Schwer zu glauben. Monkeypatching

>>> wenn ich im debugger die Klasse untersuche, hat sie zwei Methoden mit
>>> dem Namen __adjust_bound_col_idx.

Ein Klasse kann keine zwei Methoden mit gleichen Namen haben - absolut
unmöglich. Wahrscheinlich lügt Dir WingIDE irgendwas vor (wie so oft).

>>> Jedenfalls behaupted das die codeinspection von Wing4.

s.o.

>>>
>>> Ist es möglich, dass "semiprivate" methoden die mit __ beginnen nicht
>>> gepatcht werden können?

Es gibt keine semiprivaten Methoden oder privaten Methoden - eine
Methode ist eine Methode ist eine Methode...alles mit "privat" ist
reine Festlegungssache ohne Python-interne Bedeutung.

- -aj

- --
ZOPYX Limited           | zopyx group
Charlottenstr. 37/1     | The full-service network for Zope & Plone
D-72070 Tübingen        | Produce & Publish
www.zopyx.com           | www.produce-and-publish.com
- ------------------------------------------------------------------------
E-Publishing, Python, Zope & Plone development, Consulting


-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (Darwin)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iQGUBAEBAgAGBQJNkEGeAAoJEADcfz7u4AZjT+sLvA9tPC4pPiGS+ylj/3C4UJa0
J16FJtBohmYozGKtq++k+zro4jYMH9kCKUcAUjFCeGM7izX4VZJrQky5uHNlFOyj
gE4gmrSYI0EWTIsJbUwfMX2vPtgFdzFy08dVLqImACr0lOaFvxf120cXWP9I/h4J
0lKxOFeOTQ4t3q3o/JrZyC38D5cgVukCP+EiUHK866X/1xsHGHJrKoWWWMoL9XKC
JKqwcluV8p8fpv7LTzjcL5YWtvoZ01/NcuhmjuN8l7uM/UWp5spRbjakPTn+OVyk
NtBmw4m/83LsooGLkACIuwNmUQJZkcvWjsIgeSfHis9Wp6BtAu4L4Gz13gX6ftBV
DrzyPSDBEWxywQcRIvW+P02Bhfti+SjMLurbDRO+hfBmAuJlKrjASxCnf4rhLcrH
tdIhZW8SwfuFlfKsX/ak8VGFXXPUZ+YujUNntxFL1nEOM9mubAs5Qi6tAvYJ7OVA
cXVVH4/wzs49px0wjRoutZfDMa+Opho=
=N3Je
-----END PGP SIGNATURE-----

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

lists.vcf (331 bytes) Download Attachment
Reply | Threaded
Open this post in threaded view
|

gelöst Re: monkey patch mit einem egg

robert rottermann
In reply to this post by robert rottermann
Am 28.03.2011 09:32, schrieb robert rottermann:
Am 27.03.2011 13:37, schrieb Diez B. Roggisch:

Am 27.03.2011 um 12:14 schrieb robert rottermann:

Hoi zäme,

ich versuche eine methode einer Klasse die aus einem egg stamm mit einem monkey pach anzupassen.

das gelingt aber nicht.
Python ist Version 2.4

was ich mache ist folgendes:
from xlwt import *
def adjust_bound_col_idx(self, *args(...)
   meine Anpassungen
   ..
Row.__adjust_bound_col_idx = adjust_bound_col_idx

jedoch wird weiterhin die ursprüngliche methode genutzt.

wenn ich im debugger die Klasse untersuche, hat sie zwei Methoden mit dem Namen __adjust_bound_col_idx.
Jedenfalls behaupted das die codeinspection von Wing4.

Ist es möglich, dass "semiprivate" methoden die mit __ beginnen nicht gepatcht werden können?

Doch, bestimmt. Du musst nur den gescopten (scheiss wort) Namen benutzen:



class Foo(object):


    def invoke(self):
        self.__protected()


    def __protected(self):
        print "original"


f = Foo()
f.invoke()


def fake(self):
    print "fake"

Foo._Foo__protected = fake

f.invoke()


Diez
_______________________________________________
python-de maillist  -  [hidden email]
http://python.net/mailman/listinfo/python-de
Diez besten dank,
mit dem komm ich ein Stück weiter. Meine Methode wird nun aufgerufen. Und schon kommt das nächste Problem.
Die Methode greift auf private Klassenvariabeln zu. Und Python behauptet stinkfrech, die gäbe es nicht:

    # monkey patch possible colindex > 256
    def adjust_bound_col_idx(self, *args):
        for arg in args:
            iarg = int(arg)
            if not ((0 <= iarg <= 1023) and arg == iarg):
                raise ValueError("column index (%r) not an int in range(1024)" % arg)
            sheet = self.__parent <------------------ hier tritt der Fehler auf
            if iarg < self.__min_col_idx:
                self.__min_col_idx = iarg
            if iarg > self.__max_col_idx:
                self.__max_col_idx = iarg
            if iarg < sheet.first_used_col:
                sheet.first_used_col = iarg
            if iarg > sheet.last_used_col:
                sheet.last_used_col = iarg
    Row._Row__adjust_bound_col_idx = adjust_bound_col_idx

AttributeError: 'Row' object has no attribute '__parent'

ich vermute das liegt auch am verwursten der Variabeln.
Wie muss ich das machen ?

ja ich musste Diez Information nur konsequenter anwenden.
Auch die "privaten" Variabeln werden gemangelt.

Folgendermassen funktionierts:
    # monkey patch possible colindex > 256
    def adjust_bound_col_idx(self, *args):
        for arg in args:
            iarg = int(arg)
            if not ((0 <= iarg <= 1023) and arg == iarg):
                raise ValueError("column index (%r) not an int in range(1024)" % arg)
            sheet = self._Row__parent
            if iarg < self._Row__min_col_idx:
                self._Row__min_col_idx = iarg
            if iarg > self._Row__max_col_idx:
                self._Row__max_col_idx = iarg
            if iarg < sheet.first_used_col:
                sheet.first_used_col = iarg
            if iarg > sheet.last_used_col:
                sheet.last_used_col = iarg
    Row._Row__adjust_bound_col_idx = adjust_bound_col_idx
   
mehr dazu fand ich unter:
http://docs.python.org/tutorial/classes.html unter

9.6. Private Variables


danke nochmals
robert


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