Pythonic在方法之外生成数据的方法

时间:2016-02-09 19:00:15

标签: python

一个愚蠢的问题,但这让我感到烦恼(不管我的愚蠢!):我认为我已经找到了一种荒谬的恐惧,即在方法使用的方法之外生成数据(不改变),但我不确定如果是这种情况。

假设我有一个方法myfx,需要一些需要冗长操作的字典datadex,但在该会话期间对所有调用都是通用的。最简单但不可行的方法是:

def myfx(x,foo):
    datadex={f:42 for f in foo} #initialise
    mungeddata=datadex[x]+1  #munge
    return mungeddata

但这会浪费太多时间。所以最好的方法是在主要范围内进行一次,就像对类变量一样:

datadex={f:42 for f in foo} #initialise
def myfx(x):
    mungeddata=datadex[x]+1  #munge
    return mungeddata

但是,我不知道为什么,但我会竭尽全力避免这种情况。它不够优雅,但我认为情况并非如此。我通常采用闭包:

def initialise(foo):
    datadex={f:42 for f in foo} #initialise
    def myfx(x):
        mungeddata=datadex[x]+1  #munge
        return mungeddata
    return myfx

或者更糟糕的是上课。我几乎完全用Python和JS编写代码。我最好的猜测是我的Perl编码时代的回归 - 不自觉地我发现自己先写了变量alla Pascal,所以我认为一些习惯会像阴影一样延续,但这并不能解释类或封闭方式,因为OO-Perl是完全不同。

3 个答案:

答案 0 :(得分:6)

类是封装此行为的正确方法。您有一些由多个函数调用共享的数据。

class MungedData(object):

    def __init__(self, foo):
        self.datadex = {f:42 for f in foo}

    def myfx(self, x):
        return self.datadex[x] + 1

md = MungedData(somefoo)
print(md.myfx(arg1))
print(md.myfx(arg2))

虽然肯定还有其他选择,但这将是Python中最常见,最直接的方法。

答案 1 :(得分:2)

Python函数是对象,可以有属性,如果你不想让你的函数在类中,你可以这样做:

def myfx(x):
    mungeddata=myfx.datadex[x]+1  #munge
    return mungeddata
myfx.datadex={f:42 for f in foo} #initialise

我想你要避免的是拥有一个全局变量。

答案 2 :(得分:0)

如果您真的只想避免面向对象的编程,可以执行以下操作来创建一个get_dict()使用生成器来存储dict的地图。

def get_dict():
  d = {f:42 for f in foo}
  while True:
    yield d

def myfx(x):
  datadex = get_dict()
  return datadex[x]+1 #munge

return myfx