2016-05-26 15 views
1

Ist es möglich, eine Funktion mit bestimmten Schlüsselwortargumenten zu definieren und dann einen Verweis auf dieselbe Funktion zu erstellen, aber verschiedene Schlüsselwortargumentwerte zu verwenden.Python - Funktionale Vererbung - Ändern von Schlüsselwortargumenten

z.B. Ich habe die folgende

def f_beta(x,a=2.7,b=3.05): 
    """The un-normalised beta distribution function.""" 
    return math.pow(x, a - 1.0)*math.pow(1.0 - x, b - 1.0) 

und ich möchte etwas Gleichwertiges tun:

f = f_beta 
g = f_beta(a=1.0, b=10.0) 

wo f eine Kopie der ursprünglichen Funktion ist, und g ist die gleiche Funktion, jedoch mit unterschiedlichen Standardwerte für die Schlüsselwortargumente. Gibt es eine Möglichkeit, dies für g zu tun, ohne f_beta in eine Klasse zu bauen, und ohne verschiedene Funktionen neu schreiben zu müssen.

Motivation: habe ich eine Klasse, die eine Elementfunktion init_dist aufweist, die an einem gewissen Punkt I im __init__() definieren über:

self.init_dist = f_beta 

und möchte in der Lage sein, in einer neuen Funktion zu übergeben .

Ich habe im folgenden betrachtete:

und haben bei der Suche nach keine Antworten kein Glück hatte, oder wo ich nach Referenzen suchen soll.

Antwort

4

Verwendung functools.partial:

Python 2.7.6 (default, Jun 22 2015, 17:58:13) 
[GCC 4.8.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from functools import partial 
>>> import math 
>>> def f_beta(x,a=2.7,b=3.05): 
...  """The un-normalised beta distribution function.""" 
...  return math.pow(x, a - 1.0)*math.pow(1.0 - x, b - 1.0) 
... 
>>> f = f_beta 
>>> g = partial(f_beta, a=1.0, b=10.0) 
>>> f() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: f_beta() takes at least 1 argument (0 given) 
>>> g() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: f_beta() takes at least 1 argument (2 given) 
>>> g(13) 
-5159780352.0 
>>> f(13, 1.0, 10.0) 
-5159780352.0 
>>> 
+0

Genau das, was ich suchte. Danke @BlackBear – oliversm