Python中奇怪的函数/类转换。我们为什么要这样做?

时间:2015-08-29 00:41:47

标签: python function python-2.7 python-3.x

我发现使用

(int)('123')

工作,与使用int('123')

相同

我对它进行了一些探索,并注意到它也适用于其他功能。

def add_10(num):
    return num + 10

print (add_10)(10) # prints 20

它也适用于类

class MyClass(object):
    def __init__(self, x):
        self.x = x

print (MyClass)(10).x  # returns 10

我之前从未表现出这种行为,是否被任何人使用?这有名字吗?在文档中的哪个地方陈述了?为什么我们有这个?

它适用于Python 2.7和Python 3。

编辑:

进一步测试,我注意到括号没有任何效果。使用((((int))))('2')int('2')

相同

3 个答案:

答案 0 :(得分:3)

让我们试着换句话说:Python中的函数只是一个普通的对象。

将一对圆括号添加到对象的名称中,无论它是什么,都会导致调用前一个对象 - 即,使用传递的参数调用它的__call__方法。

因此,Python中的名称,无论是否来自函数,都可以用括号括起来。括号将首先作为表达式解析 - 所以 - 在(int)(5)中,(int)被处理为产生int的表达式。这恰好是一个可调用的对象。

使其更容易理解的一种方法是使括号中的表达式变得不那么简单。例如 - 可以提出“可添加的函数”,在添加时创建一个新的可调用对象,该对象链接所有函数的返回值。这样做或多或少是直截了当的:

def compose(func1, func2):
    def composed(*args, **kw):
        return func2(func1(*args, **kw))
    return composed

class addable(object):
    def __init__(self, func):
        self.func = func
    def __add__(self, other):
        if callable(other):
            return addable(compose(self.func, other))
        raise TypeError
    def __call__(self, *args, **kw):
        return self.func(*args, **kw)


@addable
def mysum(a, b):
    return a + b

@addable
def dup(a):
    return a * 2

它在交互式控制台上的工作方式如下:

>>> (mysum + dup)(3, 3)
12
>>> 

答案 1 :(得分:2)

您可以添加parenthesis in many places,而不会影响代码的运行方式:

>>> (1)+(2)
3
>>> (1)+(((2)))
3
>>> (((int)))('123')
123

它不是强制转换,只是用括号括起函数对象。

答案 2 :(得分:1)

您可以在任何表达式周围加上括号。一种表达方式是名称。名称可以引用任何值,字符串,函数和类型都只是不同类型的值。多层括号也不是特殊的,因为括号表达式也是一个表达式,你可以将它们放在括号中。