我发现使用
(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')
答案 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)
您可以在任何表达式周围加上括号。一种表达方式是名称。名称可以引用任何值,字符串,函数和类型都只是不同类型的值。多层括号也不是特殊的,因为括号表达式也是一个表达式,你可以将它们放在括号中。