导入后更改函数中的参数

时间:2018-05-21 20:02:31

标签: python function

我有一个脚本,它有一个在整个脚本中用于各种类和其他函数的函数。

例如:

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()将基于新值而不是脚本中编码的内容。

3 个答案:

答案 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)
...