Bsp.:
Code: Alles auswählen
class test:
def test1(self, arg1, arg2):
print arg1, arg2
Code: Alles auswählen
class test:
def test1(self, arg1, arg2):
print arg1, arg2
Code: Alles auswählen
In [22]: class test:
.22.: def test1(self, arg1, arg2):
.22.: print arg1, arg2
.22.:
In [23]: inspect.getargs(test.test1.im_func.func_code)
Out[23]: (['self', 'arg1', 'arg2'], None, None)
Code: Alles auswählen
>>> class Foo:
... def my_fn(self, something, irgendwas="default", foo=3.14):
... lokal = 67
...
>>> f = Foo()
>>> print f.my_fn.im_func.func_code.co_argcount
4
>>> print f.my_fn.im_func.func_code.co_varnames
('self', 'something', 'irgendwas', 'foo','lokal')
>>> print f.my_fn.im_func.func_defaults
('default', 3.1400000000000001)
Code: Alles auswählen
class test:
def test1(self, arg1, arg2):
ich_auch = 123
print arg1, arg2
und_auch_ich = "blabla"
print test().test1.im_func.func_code.co_varnames
Code: Alles auswählen
('self', 'arg1', 'arg2', 'ich_auch', 'und_auch_ich')
Code: Alles auswählen
class test:
def test1(self, arg1, arg2):
ich_auch = 123
print arg1, arg2
und_auch_ich = "blabla"
print test().test1.im_func.func_code.co_varnames
Code: Alles auswählen
('self', 'arg1', 'arg2', 'ich_auch', 'und_auch_ich')
ModuleManager >get_CGI_data<-error: save_internal_page() takes exactly 5 arguments ['content', 'markup', 'name', 'description'], but 3 given from CGI data: ['content', 'markup', 'description'] Compare the html form and the module manager get_CGI_data config!
Code: Alles auswählen
class test:
def test1(self, arg1, arg2):
ich_auch = 123
print arg1, arg2
und_auch_ich = "blabla"
argcount = test().test1.im_func.func_code.co_argcount
varnames = test().test1.im_func.func_code.co_varnames
print varnames[1:argcount]
('arg1', 'arg2')
BlackJack hat geschrieben:Ich verstehe immer noch nicht warum Du Dich auf Deine Hoffnung verlässt statt einfach das `inspect` Modul zu benutzen. Dafür ist es schliesslich da.
Wobei ich zugeben muss, dass ich, genauso wie du, BlackJack, den Vorteil nicht sehe, vor allem da das Modul ja so oder so in der stdlib ist. Und es ist ja nicht so, dass ein Modul hin oder her wahnsinnige Performanceunterschiede macht.jens hat geschrieben:Ich sehe einfach den Vorteil darin, inspect nicht importieren zu müßen
Naja, deine Begründung 'Dafür ist es schliesslich da.' ist nicht gerade überzeugendBlackJack hat geschrieben:Ich verstehe immer noch nicht warum Du Dich auf Deine Hoffnung verlässt statt einfach das `inspect` Modul zu benutzen. Dafür ist es schliesslich da.
Code: Alles auswählen
class test:
def test1(self, arg1, arg2):
ich_auch = 123
print arg1, arg2
und_auch_ich = "blabla"
import inspect
args = inspect.getargspec(test().test1)
print args
print args[0][1:]
Darf ich denn hier hoffen, das args[0][1:] immer richtig ist?(['self', 'arg1', 'arg2'], None, None, None)
['arg1', 'arg2']
Nicht? Du verlässt Dich also lieber auf selbstgeschriebenen Quelltext, der ziemlich tief in den "Eingeweiden" der Sprache rumwühlt, anstatt ein Modul aus der Standardbibliothek zu benutzen, welches gut getestet ist, auch in der nächsten Python Version noch funktioniert und eigentlich auch in Jython, IronPython und PyPy vorhanden sein sollte. Auch wenn dort die Interna von Funktionen und Methoden ganz anders aussehen könnten und Dein Code da auf die Nase fallen könnte!?jens hat geschrieben:Naja, deine Begründung 'Dafür ist es schliesslich da.' ist nicht gerade überzeugendBlackJack hat geschrieben:Ich verstehe immer noch nicht warum Du Dich auf Deine Hoffnung verlässt statt einfach das `inspect` Modul zu benutzen. Dafür ist es schliesslich da.
Das die Funktion in CPython `im_func` usw. benutzt ist ein Implementierungsdetail. Wenn man das in Jython benutzt, könnte ich mir zum Beispiel vorstellen, das die Java Reflection API stattdessen benutzt wird. Der Vorteil: Du brauchst Dich um solche "Kleinigkeiten" nicht kümmern.jens hat geschrieben:Die Begründung hört sich schon viel besser an. Ich verwende auch inspect... Aber...
Ich hab mir jetzt mal inspect.getargspec() angesehen. Es benutzt auch im_func, co_argcount und co_varnames. Das ganze bietet zwar noch mehr informationen, aber die brauche ich garnicht...