我有一个脚本,它有一个在整个脚本中用于各种类和其他函数的函数。
例如:
from scipy.stats import beta
import matplotlib.pyplot as plt
def function(i):
x = beta.pdf(i,a=10,b=2, scale = 100, loc = -50)
return x
def plotme():
graphme = []
for i in range(500):
graphme.append(function(i))
plt.plot(graphme)
def average():
averageme = []
for i in range(500):
averageme.append(function(i))
average = sum(averageme)/float(len(averageme))
return print(average)
现在,如果我想导入模块并调用plotme()或average(),它将使用函数(i)中的值。但有没有办法让我在导入时更改函数(i)中a,b,scale和loc的值?我知道我可以改变每个功能以允许它改变,但我希望我可以调整初始功能。
理想情况下,我希望能够做到这样的事情:
import mymodule
mymodule.function(i, a = 500, b = 200, scale = 50, loc = 0)
mymodule.plotme()
plotme()将基于新值而不是脚本中编码的内容。
答案 0 :(得分:1)
在不触摸您的模块的情况下,您可以在导入后对其进行猴子修补。一种方法,使用你的例子:
import mymodule
def function(i):
x = beta.pdf(i, a=500, b=200, scale=50, loc=0)
return x
mymodule.function = function
mymodule.plotme()
我同意评论者jasonharper的说法,mymodule的功能可以有更好的API。
答案 1 :(得分:1)
理想情况下,如果您可以更改现有实现,则应该有一个类可以修改这些参数:
class WhateverYouCallIt:
def __init__(a=10, b=2, scale=100, loc=-50):
self.a = a
self.b = 2
self.scale = scale
self.loc = loc
def function(self, i):
return beta.pdf(i, a=self.a, b=self.b, scale=self.scale, loc=self.loc)
def plotme(self):
graphme = []
for i in range(500):
graphme.append(self.function(i))
plt.plot(graphme)
def average(self):
averageme = []
for i in range(500):
averageme.append(self.function(i))
average = sum(averageme)/float(len(averageme))
return print(average)
然后你可以有几个不同的参数化实例:
default_one = WhateverYouCallIt() # the default
default_one.plotme()
default_one.average()
a_different_one = WhateverYouCallIt(a=500, b=200, scale=50, loc=0)
a_different_one.plotme()
a_different_one.average()
答案 2 :(得分:0)
您可以使用functools.partial
:
from functools import partial
import mymodule
# and any time you need you assign a partial func to your function
mymodule.function = partial(mymodule.function(a=500, b=200, scale=50, loc=0))
...
mymodule.function(i)
...