[ Python ] @NotNull 装饰器如何写比较好?

2017-06-20 11:05:09 +08:00
 wentian
问题详情: https://segmentfault.com/q/1010000009853967
1471 次点击
所在节点    Python
5 条回复
XYxe
2017-06-20 13:13:30 +08:00
一个比较粗略的实现:
def not_null(*varnames):
def outer(func):
def inner(*args, **kwargs):
args_name = func.__code__.co_varnames
args_cnt = func.__code__.co_argcount # 没用到
flag = True
for name in varnames: # 这里还要考虑 varnames 中有 args 中没有的参数
index = args_name.index(name) # 还可以加上考虑 kwargs 参数
flag = flag and (args[index] is not None)
if not flag:
raise TypeError('something is None')

result = func(*args, **kwargs)
return result
return inner
return outer
XYxe
2017-06-20 13:17:37 +08:00
格式乱了,贴个图吧



另外在用的时候要:@not_null('param1', 'param2')
araraloren
2017-06-20 14:42:56 +08:00
@XYxe 返回值也要判断一下,严格的定义肯定实现不了~~
XYxe
2017-06-20 14:59:18 +08:00
@araraloren #3 哎?判断返回值那检查一下倒数第四行的 result 不就可以了吗?
araraloren
2017-06-20 16:04:41 +08:00
@XYxe 是的,不要在意后面那句话,我看错了

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

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

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

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

© 2021 V2EX