这不是一个大问题,但它困扰我,所以我决定寻求灵感。
假设一个定义如下的函数:
def store(book=None, author=None):
pass
当这样调用这个函数时:
book = Book()
author = Author()
store(book=book, author=author)
我是否因为book=book
和author=author
而害怕副作用?我倾向于将功能重新定义为
def store(thebook=None, theauthor=None):
pass
但似乎有点冗长。有什么建议吗?
答案 0 :(得分:4)
你没有恐惧的副作用。它在语义上与你刚刚调用
时没有什么不同store(book, author)
值存储在函数范围内的新变量中,受所有正常python范围规则的约束。
如果需要,关键字参数可以让您使用其他更具体的变量名称。名称book
和author
非常通用,在函数中是合适的,它应该是可重用的,因此更抽象一些。但是在调用范围内使用更具体的名称可能是合适的。从这个角度来看,thebook
和theauthor
与book
和author
并没有什么不同;你想要做更多的事情 - 比如 - local_book
或borrowed_book
- 或者更准确地描述这本书的内容。
答案 1 :(得分:3)
首先,说store(book=book, author=author)
时没有歧义或副作用。一般来说,解释器从名称中告诉参数名称没有问题。
现在,关于你问题的第二部分,我认为你不应该改变函数参数的名称:毕竟,store()
从{一般意义上的{1}}和book
。
然而,您的局部变量可能更准确地说明它们包含的内容。他们可能不会引用任何书籍或作者,但具有特定特征的书籍,例如当前书或畅销书作者
因此,如果您希望消除名称歧义,我建议您重命名本地变量。
答案 2 :(得分:2)
否,不会有任何副作用。
调用函数中变量的名称空间,以及中函数中参数的名称空间是独立的,不会相互影响。
答案 3 :(得分:1)
您的参数名称与变量参数相同不会有任何问题,因为它们的解析方式不同:
parameters: '(' [varargslist] ')'
varargslist: ((fpdef ['=' test] ',')*
('*' NAME [',' '**' NAME] | '**' NAME) |
fpdef ['=' test] (',' fpdef ['=' test])* [','])