type() liefert <type 'instancemethod'>

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
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Dienstag 1. Mai 2007, 19:02

Ich erstelle einen SimpleXMLRPCServer und möchte alle Methoden registrieren, die mit "rp_" (remote procedure) beginnen. Auszug:

Code: Alles auswählen

def start_server(self):
	# Create server.
	self.server = SimpleXMLRPCServer.SimpleXMLRPCServer((self.host, self.port))
	# Register all methods starting with "rp_".
	for attr in dir(self):
		if attr.startswith("rp_"):
			func = getattr(self, attr)
			if type(func) == types.FunctionType:
				self.server.register_function(func)
			print type(func), types.FunctionType, types.InstanceType
	# Start server.
	#self.server.serve_forever()
Liefert:

Code: Alles auswählen

<type 'instancemethod'> <type 'function'> <type 'instance'>
Wie kann ich denn rauskriegen, ob das Attribut `getattr(self, "rp_foo")` wirklich eine Methode der Klasse ist und keine Variable? Im Modul `types` finde ich dafür keinen sinnvollen Vergleichswert... weder `types.FunctionType` noch `types.InstanceType` liefert True.
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Dienstag 1. Mai 2007, 19:07

types.MethodType
TUFKAB – the user formerly known as blackbird
BlackJack

Dienstag 1. Mai 2007, 19:41

Ich weiss nicht ob es besonders "pythonisch" ist, so genau zu sein. Reicht es nicht mit `callable()` zu prüfen ob man das Objekt aufrufen kann?
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Mittwoch 2. Mai 2007, 10:11

+1 für BlackJacks Lösung.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Antworten