2016-06-01 3 views
1

Let passieren sagen, ich habe eine ZeichenfolgeWie würde jemand wissen, wenn ein Objekt als Argument an Funktionen

my_str = "Hello World" 
func1 = getattr(__builtins__, 'len') 
func1 
<built-in function len> 
func1() 
Traceback (most recent call last): 
  File "<stdin>", line 1, in <module> 
TypeError: len() takes exactly one argument (0 given) 

func1(my_str) 
11 

In func1 ich das my_str Objekt in func1 passieren muß die Ergebnisse zu erhalten, aber wenn ich so etwas wie dieses

func2 = getattr(my_str, 'replace') 
func2 
<built-in method replace of str object at 0x102d83cc0> 

func2() 
Traceback (most recent call last): 
   File "<stdin>", line 1, in <module> 
TypeError: replace() takes at least 2 arguments (0 given) 

func2("Hello", "Yello") 
'Yello World' 

Hier func2 tun, ist ein integrierte methed von my_str Objekt und ich muss mein_str-Objekt nicht übergeben.

Gegeben 2 Objekte func1 und func2 Ich mag wissen würde, ist sie ein Weg zwischen diesen zwei Funktionen während der Laufzeit

+0

Welchen Unterschied interessiert Sie? –

+0

@LutzHorn Wann übergeben Sie my_str als Argument und wenn nicht –

Antwort

1

Das Problem kann gelöst werden, wenn folgende Frage beantwortet werden kann.

ob eine Funktion/Methode ein Teil eines Objekts ist oder nicht? In diesem Beispiel ist func1 eine unabhängige Funktion und func2 ist eine Methode des 'str'-Objekts.

"__self__" Attribut kann verwendet werden, um das zu beantworten.

my_str = "Hello World" 
func1 = getattr(__builtins__, 'len') 
func1 
func1.__self__ # is empty 

func2 = getattr(my_str, 'replace') 
func2 
func2.__self__ # it is non-empty 
2

Dieses Problem zu unterscheiden potenziell viel komplizierter, als man ist beschreiben. Funktionen können auch optionale Argumente (Bereitstellung von Standardwerten), eine variable Anzahl von Positionsargumenten (*args), Schlüsselwortargumente (**kwargs) enthalten.

Zur Funktion der arg-spec zu inspizieren, Sie inspect.getargspec verwenden können:

import inspect 
def f(): pass 
def g(x): pass 
inspect.getargspec(f) 
=> ArgSpec(args=[], varargs=None, keywords=None, defaults=None) 
inspect.getargspec(g) 
=> ArgSpec(args=['x'], varargs=None, keywords=None, defaults=None) 

Dies zeigt deutlich die Unterschiede zwischen den Unterschriften von f und g.

+0

inspect.getargspec funktioniert nicht für integrierte Funktionen, siehe http://bugs.python.org/issue1748064 –