【问题标题】:Changing arguments in Function after Importing导入后更改函数中的参数
【发布时间】:2018-05-21 20:02:31
【问题描述】:

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

例如:

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、比例和 loc 的值?我知道我可以更改每个功能以允许它更改,但我希望我可以调整初始功能。

理想情况下,我希望能够做这样的事情:

import mymodule

mymodule.function(i, a = 500, b = 200, scale = 50, loc = 0)
mymodule.plotme() 

并且 plotme() 将基于新值而不是脚本中的编码。

【问题讨论】:

  • 理想情况下,plotme()averageme() 会将函数作为其参数之一,因此您可以将它们应用于您想要的任何函数。
  • 你不能只传递 a、b、scale 和 loc 作为参数并为它们分配默认值吗? def function(i, a=10, b=2, scale=100, loc=-50),您可以在模块中将默认值作为常量传递给其他函数。

标签: python function


【解决方案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。

【讨论】:

  • 我同意它可能会更好!我只是在寻找一个快速而肮脏的解决方案,而且效果很好,谢谢!
【解决方案2】:

理想情况下,如果您可以更改现有实现,它应该有一个可以修改这些参数的类:

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()

【讨论】:

    【解决方案3】:

    你可以使用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)
    ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 2019-06-30
      • 2021-05-10
      • 2015-11-27
      • 1970-01-01
      • 1970-01-01
      • 2018-08-10
      相关资源
      最近更新 更多