防止函数成为Python 2中的实例方法

时间:2015-01-01 21:50:43

标签: python python-3.x portability python-2.x

我正在编写一些适用于Python 3但不适用于Python 2的代码。

foo = lambda x: x + "stuff"

class MyClass(ParentClass):
    bar = foo

    def mymethod(self):
        return self.bar(self._private_stuff)

我希望它只是打印私有内容,但如果我尝试运行mymethod,我会得到:

TypeError: unbound method <lambda>() must be called with MyClass instance as first argument (got str instance instead)

当然,以上不是实际的代码,而是真实的简化。我想这样做是因为我需要传递我不想将最终用户暴露给任何扩展我的课程的人的私人信息。但是在Python 2中,全局级lambda(或任何普通函数)变为instancemethod,在这种情况下是不需要的!

你建议我把这段代码移植一下吗?

2 个答案:

答案 0 :(得分:8)

最简单的:

class MyClass(ParentClass):
    bar = staticmethod(foo)

其余代码保持不变。尽管staticmethod最常用作“装饰器”,但没有要求这样做(因此,不需要更进一步的间接使bar成为调用{{1}的装饰方法})。

答案 1 :(得分:4)

我会选择Alex Martelli的建议。但是,为了记录,(我在看到Alex Martelli的漂亮答案之前写了这个答案)你也可以在Python 2.7和3.x中做以下(特别注意我提供的文档链接,以便你理解发生了什么):

您可以使用static method,它不会期望隐含的第一个参数。请注意lambda expressions cannot take statements,因此您无法在2.x中的print函数中使用lambda语句。

foo = lambda x: x            # note that you cannot use print here in 2.x

class MyClass(object):

    @staticmethod            # use a static method
    def bar(x):
        return foo(x)        # or simply print(foo(x))

    def mymethod(self):
        return self.bar(1)

>>> m = MyClass()
>>> m.mymethod()
1