[python] Problem s argumentami pri volani metody instancie

mykhal michal.bozon na gmail.com
Pátek Březen 31 13:29:32 CEST 2017


abych tak nejak vysvetlil sve myslenkove pochody, s ohledem na
zacatecnika..

kdyz si nadefinujeme funkci, ktera vraci svoje argumenty jako tuple:

def f(*a):
    return a

tedy potom f() nam vraci prazdny tuple (), f('x') nam da ('x',)

a vytvorime tridu s metodou, ktera bude nasi funkci f

class C:
    def f(*a):
        return a

nebo v podstate analogicky zapis:

class C:
    f = f

a vytvorime instanci c:

c = C()

potom c.f() nam nedava prazdny tuple, ale vidime neco treba jako
(<__main__.C instance at 0x7f8379f164d0>,)
takto jsme se presvedcili, se se nam tam opravdu vklada jako prvni
argument objekt ze ktereho volame, to zname "self" (take vidime, ze ho
nemusime mit nikde napsane pod timto jmenem)

pokud si vytvorime z nasi funkce f instanci objektu vyse zminovanaho
Callable z MultipartPostHandler.py:

class Callable:
    def __init__(self, obj):
        # klasicka inicializace, vyzaduje jeden argument..
        # tento objekt se nam bude volat pri volani instance teto
tridy
        self.__call__ = obj
f_c = Callable(f)

pak se nam f_c bude chovat stejne jako f (akorat, ze to neni objekt
typu function)

pokud ho pouzijeme analogicky v definici tridy:

class C:
    f = f_c
c = C()

potom nam uz c.f() vraci prazdny tuple - uz se nam tam nevklada
"self", chova se to, jako bychom meli
class C:
    @staticmethod
    def f(*a):
        return a

... tak z techto duvodu se domnivam ze jde o hack, jak udelat
statickou metodu. zamozrejme nemuzu vyloucit ze jsem autora
MultipartPostHandler.py podcenil a nepochopil, a ze se jedna o nejake
genialni reseni.., ktere ma jeste jine zavazne dusledky.. :-)

 m.


On Jul 18, 2:53 am, Carry <carr... na seznam.cz> wrote:
> Dakujem za odpoved. Myslim ze mate pravdu, aj ked tomu este nerozumiem.
> Je mozne ze som tam pridal ten self sam, ale zistil som ze mam starsiu
> verziu modulu ako je ta v odkaze (kde self v definicii nie je). Neviem
> co znamena Callable, este som sa s tym nestretol, budem musiet
> dostudovat tuto tematiku, vidim to poprve. Az teraz som si vsimol ze v
> tom module je za definiciou nejake Callable, ktore spominate. Ako
> vravim, zatial som skor uzivatel. V kazdom pripade pomohlo odstranit
> self parameter z definicie a teda asi rozbehnut ten hack, ktoremu zatial
> nerozumiem. Myslim ze ho zatial necham tak ako je, kedze funguje,
> minimalne nez to pochopim...
>
> mykhal wrote:
> > .. kdyz si znova ctu vas prispevek, tak to spis vypada, ze jste
> > zkopirovat ten hack nezapomnel, ale pridal jste metode
> > multipart_encode navic prvni argument self, coz je mozna trochu lepsi
> > reseni. v tom pripade je ale potreba smazat
> > multipart_encode = Callable(multipart_encode)
> > a vubec celou tridu Callable
>
> >  m.
>
> > On Jul 17, 6:05 pm, Carry <carr... na seznam.cz> wrote:
> >> Zdravim,
>
> >> snazim sa pouzit vo svojom skripte modul MultipartPostHandler.py (zhttp://odin.himinbi.org/MultipartPostHandler.py) pre posielanie http
> >> requestov serveru ale python hlasi tuto chybu:
>
> >>   File "...\MultipartPostHandler.py", line 79, in http_request
> >>      boundary, data = self.multipart_encode(v_vars, v_files)
> >> TypeError: multipart_encode() takes at least 3 arguments (2 given)
>
> >> riadok 79 je toto volanie v metode objektu:
> >>          boundary, data = self.multipart_encode(v_vars, v_files)
>
> >> ...a signatura metody je:
> >>      def multipart_encode(self, vars, files, boundary = None, buf = None):
>
> >> Self sa predava implicitne a posledne dva parametre maju tiez implicitne
> >> hodnoty, takze nechapem co mu vadi :-/
>
> >> Prosim o zhovievavost, nakolko som v Pythone newbie.
> >> Dopredu vdaka za Vase odpovede.
> >> carry



Další informace o konferenci Python