Seite 1 von 1

hasattr()-Value

Verfasst: Donnerstag 19. März 2009, 14:25
von mzh
Hallo zusammen

Ich will mich nur vergewissern, ob ich das richtig verstehe. Funktionen sind callable und Strings nicht, richtig? In Python 3.0.1 sagt man dann, Funktionen haben das '__call__'-Attribut, Strings nicht.

In Python 3.0.1:

Code: Alles auswählen

>>>hasattr(getattr(list, 'append'), '__call__')
True
>>>hasattr(getattr(list.append, '__doc__'), '__call__')
False
Was bedeutet es, wenn ein Objekt (Funktion oder String) callable sind (bzw. über das '__call__'-Attribut verfügen)?
Es kommt manchmal eine Fehlermeldung "XY ist nicht callable". Was für einen Fehler habe ich dann gemacht?

Verfasst: Donnerstag 19. März 2009, 14:42
von Rebecca
callable bedeutet, dass du ein Objekt wie eine Funktion aufrufen kannst, also runde Klammern hinter seinen Namen setzen kannst und da evtl noch Parameter reinschreiben kannst:

Code: Alles auswählen

>>> l = [1, 2, 3]
>>> l.append(5)  # da l.append callable
>>> dir(l) # da dir callable
...
Wenn du die Fehlermeldung "object not callable" bekommst, heisst das, dass du ein Objekt wie eine Funktion aufrufst, das nicht callable ist:

Code: Alles auswählen

>>> "hallo"(1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object is not callable
>>> l(1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'list' object is not callable

Verfasst: Donnerstag 19. März 2009, 15:08
von mzh
thanks.

Verfasst: Donnerstag 19. März 2009, 15:40
von derdon
Einfacher (und lesbarer) ist es, wenn man die Funktion callable verwendet, die als Parameter das zu prüfende Objekt bekommt.

Verfasst: Donnerstag 19. März 2009, 15:49
von DasIch

Code: Alles auswählen

bash-3.2$ python3
Python 3.0.1 (r301:69556, Feb 22 2009, 14:12:04)
[GCC 4.3.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> callable(lambda x: x)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'callable' is not defined
*hust*

Verfasst: Donnerstag 19. März 2009, 15:59
von derdon
Oh, hab vergessen, dass mzh schon Python 3.0.1 hat.