【发布时间】:2020-02-16 11:33:19
【问题描述】:
我正在尝试了解一流的功能以及如何在实际示例中使用它们。我想出的示例是在为登录用户调用特定函数之前进行身份验证。例如:
def authenticate(user_id):
if user_id != 1: return None
def call_func(func_name):
print(f"{user_id} is logged in! ==> Calling function '{func_name}'")
return call_func
user0 = authenticate(user_id=0)
if user0: user0(func_name='xyz')
user1 = authenticate(user_id=1)
if user1: user1(func_name='xyz')
哪些打印:
1 已登录! ==> 调用函数'xyz'
这是对一等函数的正确理解吗?以上似乎更像是wrapper 或decorator 的概念。这些基本上是一样的吗,或者这三个概念有什么区别?
【问题讨论】:
-
我认为您的理解可能存在类别错误。 “一流的功能”不是一种技术;这是对您使用的语言中的函数是一流的事实的描述。您可以用来利用这一事实的技术之一是包装和/或装饰。还有其他的。
-
"first class" 只是意味着函数本身就是可以传递、存储在变量等中的对象。与函数不是对象的 C 相比。如果你想传递一个函数,你能做的最好的就是传递一个指向函数的指针。
-
我认为这对于 Stack Overflow 来说太宽泛了——你可以在网上找到很多关于“一流函数”概念的定义。装饰器是一个基于此的概念——装饰器是一个函数,其输入和输出都是函数,如果没有一流的函数,你就无法做到这一点。但是装饰器只是通过一流的功能实现的几种功能之一。
-
您正在考虑的涉及传递函数的概念称为“高阶函数”。