Umgang mit <type 'function'> und ähnlichem

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
Goswin
User
Beiträge: 361
Registriert: Freitag 8. Dezember 2006, 11:47
Wohnort: Ulm-Böfingen

Freitag 27. März 2009, 13:45

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 :-) )
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Freitag 27. März 2009, 13:52

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.
Zuletzt geändert von derdon am Freitag 27. März 2009, 14:01, insgesamt 1-mal geändert.
DasIch
User
Beiträge: 2452
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Freitag 27. März 2009, 13:59

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
Benutzeravatar
Goswin
User
Beiträge: 361
Registriert: Freitag 8. Dezember 2006, 11:47
Wohnort: Ulm-Böfingen

Freitag 27. März 2009, 14:41

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 :-).
DasIch
User
Beiträge: 2452
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Freitag 27. März 2009, 14:47

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).
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 27. März 2009, 14:56

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
DasIch
User
Beiträge: 2452
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Freitag 27. März 2009, 16:38

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.
Antworten