Re: [python] nazev metody

2007-01-11 Tema obsahu Petr Prikryl
Všechno už bylo vymyšleno. Dokonce docela dávno, kdy se s tím
člověk ještě nadřel... ;)

http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/52315
 
pepr
___
Python mailing list
Python@py.cz
http://www.py.cz/mailman/listinfo/python


Re: [python] nazev metody

2007-01-11 Tema obsahu Jan Janech
> S tím x.bb() je to asi pochopitelné a nic se s tím nedá dělat.
> Stejně tak bych mohl definovat:
> 
> bb = x.aa
> bb()
> 
> a taky to ukáže, že se volá metoda aa. Ta informace je tam
> uložená z doby kompilace. bb je reference na objekt metody
> a ta patří k třídě. Nesmí záležet na tom, jakým způsobem 
> se k němu dostanu.
> 
> pepr
este pri jednej veci to zblbne... ono takto zistim nazov skompilovaneho
bloku kodu... nie nazov fcie...

~ CODE ~
In [1]: import sys

In [2]: import types

In [3]: class a:
   ...: def aa(self):
   ...: print "ja jsem metoda:", sys._getframe(0).f_code.co_name
   ...: bb = aa
   ...: cc = types.FunctionType(aa.func_code, aa.func_globals, 'cc')
   ...:

In [4]: a.aa.__name__
Out[4]: 'aa'

In [5]: a.bb.__name__ # bb je len referencia na aa
Out[5]: 'aa'

In [6]: a.cc.__name__ # tu je spravne 'cc'
Out[6]: 'cc'

In [7]: a().aa()
ja jsem metoda: aa

In [8]: a().bb()
ja jsem metoda: aa

In [9]: a().cc() # a hups tu je 'aa'
ja jsem metoda: aa

~ /CODE ~

Neviem kto by nieco taketo pouzival, ale je mozne ze to vyuzivaju
niektore frameworky.

Da sa nejako dostat ku instancemethod objektu, nemiesto code objektu?

___
Python mailing list
Python@py.cz
http://www.py.cz/mailman/listinfo/python


Re: [python] nazev metody

2007-01-11 Tema obsahu Petr Prikryl
Radek Kanovsky
> mtip wrote:
> > potreboval bych zjistit nazev metody uvnitr tridy.
> > [...]
> import sys
> class a:
> def aa(self):
> print "ja jsem metoda:", sys._getframe(0).f_code.co_name
> 
> bb = aa
> x=a()
> x.aa()
> x.bb()
> 
> Neni to ale stoprocentne spolehlive, jak lze videt pri volani x.bb().

Aha, frame lze získat i takhle,... Paráda. 
Takže navrhuji kombinaci:

import sys

def MojeJmeno():
'''Vraci jmeno volajiciho.'''
return sys._getframe(1).f_code.co_name

class a:
def aa(self):
print 'Jsem metoda', MojeJmeno()

x = a()
x.aa()

S tím x.bb() je to asi pochopitelné a nic se s tím nedá dělat.
Stejně tak bych mohl definovat:

bb = x.aa
bb()

a taky to ukáže, že se volá metoda aa. Ta informace je tam
uložená z doby kompilace. bb je reference na objekt metody
a ta patří k třídě. Nesmí záležet na tom, jakým způsobem 
se k němu dostanu.

pepr
___
Python mailing list
Python@py.cz
http://www.py.cz/mailman/listinfo/python


Re: [python] nazev metody

2007-01-11 Tema obsahu Petr Prikryl
mtip
> potreboval bych zjistit nazev metody uvnitr tridy.
> asi takhle:
> class a:
> def aa(self):
> print "ja jsem metoda:", xxx
> x=a()
> x.aa()

Možná by bylo dobré objasnit, proč to chceš vědět.
Pokud je to například kvůli výpisu informace, 
kde se něco nepovedlo, pak může být lepší
nastudovat si modul inspect:

class a:
def aa(self):
import inspect
frame = inspect.currentframe()
info = inspect.getframeinfo(frame)
print 'Jsem metoda', info[2]
print 'Podrobnejsi info:', info

x=a()
x.aa()

Dalo by se to vylepšit třeba takto:

def JmenoMetody():
import inspect
return inspect.stack()[1][3]

class a:
def aa(self):
print 'Jsem metoda', JmenoMetody()

x=a()
x.aa()

Upřímně řečeno, nenapadá mě, jak by funkce mohla
jinak zjistit své jméno, aniž by se v zápisu to
jméno objevilo. Ale možná to jde i jednodušeji.

pepr
___
Python mailing list
Python@py.cz
http://www.py.cz/mailman/listinfo/python


Re: [python] nazev metody

2007-01-11 Tema obsahu mtip
RK> On Thu, Jan 11, 2007 at 12:07:45PM +0100, mtip wrote:

>> Zdravim,
>> potreboval bych zjistit nazev metody uvnitr tridy.
>> asi takhle:
>> class a:
>> def aa(self):
>> print "ja jsem metoda:", xxx
>> 
>> x=a()
>> x.aa()

RK> import sys

RK> class a:
RK> def aa(self):
RK> print "ja jsem metoda:",
RK> sys._getframe(0).f_code.co_name

RK> bb = aa

RK> x=a()
RK> x.aa()
RK> x.bb()

RK> Neni to ale stoprocentne spolehlive, jak lze videt pri volani x.bb().

RK> Radek Kaňovský
RK> ___
RK> Python mailing list
RK> Python@py.cz
RK> http://www.py.cz/mailman/listinfo/python




---

Diky super, to je presne ono.

-- 
Mirek N.

___
Python mailing list
Python@py.cz
http://www.py.cz/mailman/listinfo/python


Re: [python] nazev metody

2007-01-11 Tema obsahu mtip
PV> class C:
PV>  def m1(self):
PV>   print self.m1.__name__
Jenze ja to m1 v self.m1.__name__ prave neznam a potrebuju ho zjistit.

-- 
Mirek N.

___
Python mailing list
Python@py.cz
http://www.py.cz/mailman/listinfo/python


Re: [python] nazev metody

2007-01-11 Tema obsahu Radek Kanovsky
On Thu, Jan 11, 2007 at 12:07:45PM +0100, mtip wrote:

> Zdravim,
> potreboval bych zjistit nazev metody uvnitr tridy.
> asi takhle:
> class a:
> def aa(self):
> print "ja jsem metoda:", xxx
> 
> x=a()
> x.aa()

import sys

class a:
def aa(self):
print "ja jsem metoda:", sys._getframe(0).f_code.co_name

bb = aa

x=a()
x.aa()
x.bb()

Neni to ale stoprocentne spolehlive, jak lze videt pri volani x.bb().

Radek Kaňovský
___
Python mailing list
Python@py.cz
http://www.py.cz/mailman/listinfo/python


Re: [python] nazev metody

2007-01-11 Tema obsahu Jan Janech
mtip wrote:
> Zdravim,
hello,
> potreboval bych zjistit nazev metody uvnitr tridy.
> asi takhle:
> class a:
> def aa(self):
> print "ja jsem metoda:", xxx
> 
> x=a()
> x.aa()

Asi takto:

~~ CODE ~~`
In [1]: import sys

In [2]: def ahoj_ja_som_fcia():
   ...: print "ja som:", sys._getframe().f_code.co_name
   ...:

In [10]: ahoj_ja_som_fcia()
ja som: ahoj_ja_som_fcia

~~ /CODE ~~`

vie niekto, ci sa da zistit nejako aj ku ktoremu objektu metoda patri ?
lebo tymto sposobom sa nedostanem ku objektu instancemethod, ale ku
objektu code. A tam sa uz samozrejme ku im_self nedostanem :(
>
> diky za pomoc.
>

___
Python mailing list
Python@py.cz
http://www.py.cz/mailman/listinfo/python


Re: [python] nazev metody

2007-01-11 Tema obsahu Petr Vaněk
On Thursday 11 January 2007 12:07, mtip wrote:
> Zdravim,
> potreboval bych zjistit nazev metody uvnitr tridy.
> asi takhle:
> class a:
> def aa(self):
> print "ja jsem metoda:", xxx
>
> x=a()
> x.aa()

class C:
 def m1(self):
  print self.m1.__name__

> diky za pomoc.

neni zac, mam rad pivo a kocici jazycky.

p.


pgpO9ZFzvJbGP.pgp
Description: PGP signature
___
Python mailing list
Python@py.cz
http://www.py.cz/mailman/listinfo/python