Seite 1 von 1

Umgang mit <type 'function'> und ähnlichem

Verfasst: Freitag 27. März 2009, 13:45
von Goswin
Kann mir vielleicht jemand folgendes Verhalten erklären?

Code: Alles auswählen

def ff(x): return x
print type(ff) #<type 'function'>
print repr(ff.__class__) #<type 'function'>
print isfunction(ff) #True
print isinstance(ff,function) #TypeError, warum?

class Kl(object): pass;  inst = Kl()
print type(inst) #<class '__main__.Kl'>
print repr(inst.__class__) #<class '__main__.Kl'>
print isinstance(inst,Kl) #True
print isinstance(inst,__main__.Kl) #NameError: name '__main__' not defined
( :-) Ich erwarte vom Forum NICHT, dass es mir meine Probleme löst, sondern mein Metaproblem. Meine Probleme sollten ja MEINE Arbeit sein; mein Metaproblem ist, Python zu lernen :-) )

Re: Umgang mit <type 'function'> und ähnlichem

Verfasst: Freitag 27. März 2009, 13:52
von derdon
Goswin hat geschrieben:Kann mir vielleicht jemand folgendes Verhalten erklären?

Code: Alles auswählen

def ff(x): return x
print isinstance(ff,function) #TypeError, warum?
Weil function keine Klasse ist.
Goswin hat geschrieben:

Code: Alles auswählen

print isinstance(inst,__main__.Klb) #NameError: name '__main__' not defined
__main__ ist nicht definiert. Warum sollte das auch der Fall sein? Du bringst da anscheinend etwas mit der Abfrage

Code: Alles auswählen

if __name__ == '__main__':
    main()
durcheinander.

EDIT:

Code: Alles auswählen

print isinstance(ff,function)
gibt bei mir einen NameError, weil function nicht definiert ist.

Verfasst: Freitag 27. März 2009, 13:59
von DasIch
In Zeile 5 gibt es keine TypeError sondern einen NameError. function ist eben nicht in dem Namespace, wo sollte es auch her kommen?

Code: Alles auswählen

In [1]: from types import FunctionType

In [2]: isinstance(lambda : None, FunctionType)
Out[2]: True
__main__ ist dass Modul welches der Interpreter beim Start als Argument übergeben bekommen hat, es wird aber nicht implizit in den Namespace geworfen.

Code: Alles auswählen

class Foo(object):
    pass

import __main__

print isinstance(Foo(), __main__.Foo)
# bash-3.2$ python foo.py
# True

Verfasst: Freitag 27. März 2009, 14:41
von Goswin
Der Type von "function" ist mir nun endlich bekannt, und auch mein bisheriges Importierproblem. Vielen Dank für die Auskunft!

Dass function keine Klasse (im engeren Sinn) ist, konnte ich schon nachvollziehen. Aber isinstance(i,t) funktioniert ja auch mit type's! Verwirrt war ich, weil repr(function) den string <type,'function'> ausgibt, und nicht <type,'FunctionType'>, was meiner Ansicht nach richtiger gewesen wäre.

Es ist erstaunlich, dass der Typ FunctionType extra importiert werden muss, und dass Python Funktionen erzeugen und aufrufen kann, ohne dass diese Typbeschreibung ständig zur Verfügung steht. Noch viel erstaunlicher ist es, dass das Modul __main__ importiert werden muss, denn wir befinden uns ja gerade in diesem Modul! Da sieht wohl Python den Wald vor lauter Bäumen nicht :-).

Verfasst: Freitag 27. März 2009, 14:47
von DasIch
Goswin hat geschrieben:Dass function keine Klasse (im engeren Sinn) ist, konnte ich schon nachvollziehen.
FunctionType ist eine ganz gewöhnliche Klasse (natürlich in C geschrieben aber dass ist ja erstmal irrelevant).

Verfasst: Freitag 27. März 2009, 14:56
von Leonidas
Goswin hat geschrieben:Es ist erstaunlich, dass der Typ FunctionType extra importiert werden muss, und dass Python Funktionen erzeugen und aufrufen kann, ohne dass diese Typbeschreibung ständig zur Verfügung steht.
Die steht doch zur Verfügung nur hast du als Python-Programmierer erstmal keine Referenz dazu weil es über Syntaktischen Zucker geregelt wird.
Goswin hat geschrieben:Noch viel erstaunlicher ist es, dass das Modul __main__ importiert werden muss, denn wir befinden uns ja gerade in diesem Modul!
Es muss eigentlich nicht importiert werden, nur brauchst du eben die Referenz. Das Objekt ist ja auch ohne den Import da.

Verfasst: Freitag 27. März 2009, 16:38
von DasIch
Goswin hat geschrieben:Noch viel erstaunlicher ist es, dass das Modul __main__ importiert werden muss, denn wir befinden uns ja gerade in diesem Modul! Da sieht wohl Python den Wald vor lauter Bäumen nicht :-).

Code: Alles auswählen

In [13]: class Foo(object):
   ....:     print Foo

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
...
NameError: name 'Foo' is not defined
Das ist nicht erstaunlich sondern konsequent.