如何确保python函数仅根据其输入生成其输出?

Rom*_*man 7 python database filesystems functional-programming httpwebrequest

要生成输出,函数通常只使用其参数的值.但是,在某些情况下,生成其输出的函数会从文件系统或数据库或Web中读取内容.我希望有一种简单可靠的方法来确保不会发生类似的事情.

我看到的一种方法是创建一个python库的白名单,可用于从文件系统,数据库或Web读取.但如果它是要走的路,我在哪里可以得到这个(可能是巨大的)列表.此外,我不想仅仅因为它可以用来从文件系统读取而禁用整个库.例如,我希望用户能够使用pandas库(存储和操作表格数据).我只是不希望他们能够使用这个库从文件系统中读取数据.

有这个问题的解决方案吗?

Pyt*_*Nut 8

答案是否定的.您正在寻找的是一个可以测试的功能functional purity.但是,如此代码所示,无法保证实际上不会调用任何副作用.

class Foo(object):
    def __init__(self, x):
        self.x = x
    def __add__(self, y):
        print("HAHAHA evil side effects here...")
        # proceed to read a file and do stuff
        return self

# this looks pure...
def f(x): return x + 1

# but really...
>>> f(Foo(1))
HAHAHA evil side effects here...
Run Code Online (Sandbox Code Playgroud)

由于对象可以重新定义其行为(字段访问,调用,运算符重载等)的综合方式,因此您始终可以传递使纯函数不纯的输入.因此,唯一的纯函数是那些对它们的参数一无所知的函数......一类通常不太有用的函数.

当然,如果您可以指定其他限制,这将变得更容易.

  • @Roman:你的要求原本要强得多.您写道:"我希望用户能够...我只是不希望他们能够使用此库从文件系统中读取数据." 现在你写的是"我不会以糟糕的方式调用这些函数." 这似乎很不寻常.你相信用户,但不相信已安装的软件? (2认同)