Изменение аргументов в функции после импорта - PullRequest
0 голосов
/ 21 мая 2018

У меня есть скрипт, который имеет функцию, которая используется в различных классах и других функциях в скрипте.

Например:

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).Но есть ли способ изменить значения a, b, scale и loc в функции (i) при ее импорте?Я знаю, что могу изменить каждую функцию, чтобы она могла измениться, но я надеюсь, что смогу просто настроить начальную функцию.

В идеале я хотел бы иметь возможность сделать что-то вроде этого:

import mymodule

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

И plotme () будет основан на новых значениях, а не на том, что закодировано в скрипте.

Ответы [ 3 ]

0 голосов
/ 21 мая 2018

В идеале, если вы можете изменить существующую реализацию, у нее должен быть класс, который позволяет изменять эти параметры:

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()
0 голосов
/ 21 мая 2018

Вы можете использовать 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)
...
0 голосов
/ 21 мая 2018

Не прикасаясь к вашему модулю, вы можете обезопасить его после импорта.Один из способов, используя ваш пример:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...