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

标签 python

一个愚蠢的问题,但这让我很烦恼(不管我的愚蠢被否决了!):我想我已经意识到了一种荒谬的恐惧,害怕在该方法使用的方法之外(不改变)生成数据,但我不确定如果是这样的话。

假设我有一个方法myfx,它需要一些字典datadex,这需要一个冗长的操作来完成,但对于该 session 期间的所有调用都是通用的.最简单但不可行的方法是:

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 是完全不同。

最佳答案

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

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 中最常见和最直接的方法。

关于在方法之外生成数据的 Pythonic 方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35300097/

相关文章:

python - 直方图图像未保存

python distutils,用生成的源代码编写c扩展

python - 如何获取 cElementTree 中元素的所有文本子项?

python - 多个维度的 Numpy 滚动

python - Mnist 数据图像和标签不匹配

python - 这两种初始化数组的方式有什么区别?

python - 如何访问 wagtail 页面模型中的请求对象?

javascript - 通过 AJAX 发布 Django 表单集

python - pandas df 中 “look ahead” 值的有效方法

python - python中主线程和子线程之间的原子操作