Python 注解 @以及 django 和 flask 的使用疑问

2018-12-03 18:13:24 +08:00
 rizon

本人 java 开发最近自学 python,web 项目框架

flask 使用了注解来注册路径

@app.route("/")
def hello():
    return "Hello World!"

django 中则是

urlpatterns = [
    path('admin/', admin.site.urls)
]

问题 1:
flask 中注解是怎么实现注册的?注解的代码是在方法被调用的时候才会触发吧?那么他是怎么在项目初始化的时候注册映射的呢?

问题 2:
我喜欢注解,就想着是不是可以自己写个注解来让 django 也可以使用注解注册?其实解答了疑问 1,理论上问题 2 也就回答了吧。

3897 次点击
所在节点    Python
24 条回复
freakxx
2018-12-03 21:42:01 +08:00
@rizon
本质上还是一样的,多一层少一层其实都是一样的。
你反而可以把它当成是闭包来看待。

所以修饰器可以无限嵌套下去,也可以在修饰器内部实现参数多层处理。
只要最后返回函数本身即可。
wwqgtxx
2018-12-03 21:42:11 +08:00
@rizon 刚看到你 19#的回复,再说一下,传递的永远是个 function object 而不是什么“方法名”,只不过“带参数修饰器”本身需要返回一个函数,这个函数接受一个 callable 对象,而“不带参数修饰器”直接就是上面说的那个函数
rizon
2018-12-03 21:53:46 +08:00
@wwqgtxx #22 嗯嗯。是的,是这样的。谢谢。
xpresslink
2018-12-03 22:00:07 +08:00
@符号在 java 中是注解功能并不是实质功能,但是在 python 中 @后面跟的是装饰器,其实就是一个高阶函数,对下面的函数装饰,过程是把下面的函数当参数处理一下再输出一个处理过的函数。

python 程序的执行过程是先把源码编译成字节码,然后再用解释器解释执行字节码。
python 装饰器不是执行时调用的,而是在编译字节码的过程中就调用处理了,实际上相当于语法糖。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/513929

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX