鱼C论坛

 找回密码
 立即注册
查看: 3289|回复: 6

[已解决]python中有实时捕获(监视)某函数被调用或者调用结束(检测return结果)的办法吗?

[复制链接]
发表于 2017-7-12 13:51:09 | 显示全部楼层 |阅读模式
100鱼币
问题1:python中有实时捕获(监视)某函数被调用或者调用结束的办法吗
比如在一堆函数中的某函数func()被调用了,啪,print(巴拉巴拉)
比如在一堆函数中的某函数func()调用结束,啪,print(巴拉巴拉)


问题2:如果某函数func()被调用后return了一个数字2,是否有一个通用办法:
if func()函数被调用了 且 return回了一个数字2:
        print(巴拉巴拉)
else:
        print(哒哒哒)


实际碰到的问题,上代码
  1. import random
  2. def p1():
  3.         return 1

  4. def p2():
  5.         return 2

  6. def p3():
  7.         return 3

  8. for each in range(10):
  9.         """
  10.         在这里有个监控功能:如果p2()被调用执行了且返回了2,就在此次p2执行结束后print("巴拉巴拉")      
  11.         """        
  12.         eval("p"+str(random.randrange(1,4)))()
  13.         
复制代码
最佳答案
2017-7-12 13:51:10

具体问题具体分析,其实我还不是很理解你这个例子到底要干嘛
如果你只是想确认某个函数是否允许,并且运行得到的值是否是2,那直接把这个函数给到一个变量A,然后判断A是否等于2不就行了?
  1. A = p2()
  2. if A == 2:
  3.   print("get it")
  4. else:
  5.   print("miss")
复制代码


当然,你的需求可能并不是这么简单
所以我给你提供装饰器的方法只是让你去了解装饰器
反正我感觉装饰器应该能达到你的要求

最佳答案

查看完整内容

具体问题具体分析,其实我还不是很理解你这个例子到底要干嘛 如果你只是想确认某个函数是否允许,并且运行得到的值是否是2,那直接把这个函数给到一个变量A,然后判断A是否等于2不就行了? 当然,你的需求可能并不是这么简单 所以我给你提供装饰器的方法只是让你去了解装饰器 反正我感觉装饰器应该能达到你的要求
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-7-12 13:51:10 | 显示全部楼层    本楼为最佳答案   

具体问题具体分析,其实我还不是很理解你这个例子到底要干嘛
如果你只是想确认某个函数是否允许,并且运行得到的值是否是2,那直接把这个函数给到一个变量A,然后判断A是否等于2不就行了?
  1. A = p2()
  2. if A == 2:
  3.   print("get it")
  4. else:
  5.   print("miss")
复制代码


当然,你的需求可能并不是这么简单
所以我给你提供装饰器的方法只是让你去了解装饰器
反正我感觉装饰器应该能达到你的要求
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-7-12 14:03:55 | 显示全部楼层
装饰器,正合你意
  1. #定义一个装饰器,具体装饰器的玩法可以自己去查询,这里只是给个例子
  2. def say(func):
  3.   print(func.__name__,"被调用了,啪啪啪")
  4.   func()
  5.   print(func.__name__,"结束了,啪啪啪")
  6.   return func

  7. # 加上装饰器语法糖之后再定义你的函数
  8. @say
  9. def p2():
  10.   return 2

  11. # 调用函数,看看结果,是不是有了你要的效果
  12. p2()
  13.   
复制代码


看结果
  1. p2 被调用了,啪啪啪
  2. p2 结束了,啪啪啪
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-7-12 14:09:48 | 显示全部楼层
目前我只知道inspect模块,可以显示当前被调用的函数。
我提出这个问题的本质原因其实是,我在调教魔法方法时遇到
  1. class F(float):
  2.         def __new__(cls,*a):
  3.                 print("1")
  4.                 return super().__new__(cls,*a)
  5.                 print("2")
  6.         def __repr__(self):
  7.                 print("1")
  8.                 return super().__repr__()
  9.                 print("2")

  10. >>> f=F(10)
  11. 1
  12. >>> f
  13. 1
  14. 10.0
复制代码

如何才能把print(2)打印出来呢,我们都知道return代表函数的调用结束,但在类中如何能找到调用的魔法方法之间的“点”。比如__new__和__init__,我想在__new__调用并return后print(),比如在__repr__调用并return后print()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-7-12 14:16:30 | 显示全部楼层
本帖最后由 哭吧叫吧 于 2017-7-12 14:24 编辑
gopythoner 发表于 2017-7-12 14:03
装饰器,正合你意


p2=say(p2)
不用闭包,我在def p2的时候就出现了 p2 被调用了,啪啪啪
                                                                 p2 结束了,啪啪啪
这样岂不是p2被调用了2次么···
那魔法方法能用装饰器吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-7-12 14:17:30 | 显示全部楼层
gopythoner 发表于 2017-7-12 14:03
装饰器,正合你意

3#的问题·
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-7-12 14:40:50 | 显示全部楼层

在看看这个改了一点的,是不是更符合你的要求了
其实装饰器还可以带参数,也就是你可以把你要判断的数当做参数传入装饰器中,这样就可以变成一个通用的装饰器了,具体做法自己去查吧

  1. #定义一个装饰器,具体装饰器的玩法可以自己去查询,这里只是给个例子
  2. def say(func):
  3.   print(func.__name__,"被调用了,啪啪啪")
  4.   func()
  5.   if func() == 2:
  6.     print(func.__name__,"的结果是2")
  7.   else:
  8.     print(func.__name__,"的结果不是2")
  9.   return func

  10. # 加上装饰器语法糖之后再定义你的函数
  11. @say
  12. def p2():
  13.   return 3

  14. # 调用函数,看看结果,是不是有了你要的效果
  15. print(p2())
复制代码



打印结果入下(其中我把你的p2函数的返回值改成了3,作为测试用)
  1. p2 被调用了,啪啪啪
  2. p2 的结果不是2
  3. 3
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-18 04:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表