为什么在Python中需要括号?

时间:2017-11-30 18:17:09

标签: python methods

这个问题只是一种理解某事的尝试;我知道该怎么做,只想知道它们之间有什么区别:

datetime.datetime.now().date

datetime.datetime.now().date()

4 个答案:

答案 0 :(得分:2)

括号调用一个函数。

datetime.datetime.now().date

Works ,因为它有效的语法,但是它给你的是方法本身,而不是调用方法的结果。

你可以在REPL中看到这个:

>>> datetime.datetime.now().date
<built-in method date of datetime.datetime object at 0x7fbb8ea17620>

>>> date_method = datetime.datetime.now().date
>>> actual_date = date_method()
>>> actual_date
datetime.date(2017, 11, 30)

答案 1 :(得分:1)

括号表示您实际上想要调用方法,而不是提及以供以后使用。在它自己的一行上,后者似乎没有意义,但在更大的表达式中,它允许延迟函数调用:

# access the "date" method, but don't call it yet
fn = datetime.datetime.now().date
... do other things ...
# *now* call date()
print(fn())

fn中存储的可调用对象是绑定方法,它指的是具体对象。在Python中,方法调用和函数调用之间没有根本区别:按名称访问方法会创建绑定方法对象,然后将其作为任何其他函数调用。就Python而言,省略括号只是意味着你(还)没有兴趣调用它。

当你有一个接受可调用函数的函数时,这很有用。例如,想象一下调用一个事件处理器,它允许您为处理事件提供自定义调用。通常情况下,事件是通过GUI调度的,但您希望(暂时)想要收集刚刚创建的列表中的事件。这将是绑定方法的用例:

# library function that we cannot change
def do_processing(dispatchfn):
    for event in something_that_generates_events():
        ... internal bookkeeping
        # dispatch the event
        dispatchfn(event)

# our code to log the events
log = []
do_processing(log.append)
# ... inspect the events list, e.g.:
for event in log:
    print event

在这种情况下,使用绑定方法的替代方法是使用lambda

do_processing(lambda event: log.append(event))

但是lambda的语义和性能略有不同。使用绑定方法实际上可以在非常紧密的循环中提高性能。 Python中流行的优化是转换紧密循环:

todo = deque()
while todo:
    next_item = todo.popleft()
    ...

成:

todo = deque()
todo_popleft = todo.popleft
while todo:
    next_item = todo_popleft()
    ...

如果while循环确实很少,则此转换实际上可以提高性能,因为它消除了一次dict查找和创建绑定方法的成本。这不是常规应该做的事情,但它是未被称为绑定方法的公认用法。

答案 2 :(得分:0)

括号表示对method的调用。

答案 3 :(得分:0)

datedatetime的一种方法。无论何时你想要调用(或调用)该方法所需的日期 - 以及使用括号的方式。当您不使用括号时,您访问的是函数本身作为对象。