Python 板


LINE

※ 引述《chan15 (ChaN)》之铭言: : # -*- coding: utf-8 -*- : def run(): : def the_name(): : if not hasattr(the_name, 'name'): : the_name.name = 'test' : return the_name.name : for i in range(3): : print(the_name()) : run() : print('') : run() : print('') : run() : 各位好,我想针对上面的 code 写单元测试 : 主要是想判断第一次执行时还没有 the_name.name : 执行第一次之後便存在这个 property 因此直接回覆 the_name.name : 本是想用 self.assertFalse(getattr(run.the_name.name)) : 不过显然不能这样用,不知道怎麽可以达成需求 简单讲,**不行** https://stackoverflow.com/questions/13606178/ 如果只是回文要来回答不行,大概会被众人围殴吧 原则上,要直接 call inner function,没办法 所以解法就要先设计过,这里我想到三种解法: Method 1. 预先藏一个变数 In [77]: def a(): ...: def b(): ...: print("Hello b") ...: a._inner = b ...: b() ...: print("Hello a") ...: In [78]: a() Hello b Hello a In [79]: a._inner() Hello b Method 2. 用 class 定义 function In [80]: class A(object): ...: def __call__(self): ...: self.b() ...: print("hello a") ...: ...: def b(self): ...: print("hello b") ...: In [81]: a = A() In [82]: a() hello b hello a In [83]: a.b() hello b Method 3. 重新思考这个 inner function 重要性 可以把这个 function 提升到 global function (怎麽这麽久才想到简单明了的解法 ,果然老了) 原 PO 的目的是 unit test 要 unit test 表示有一定的重要性 我会顷向拉到 global function 藏起来的 inner function,我会把它跟外面的 function 看成是一体的 unit test 就只会测试外面的 function test case 就要想办法去测试到 inner function 番外篇: 当然,如过要硬干,还是有办法把 inner function 抓出来 不过,如果你不是要搞你家的 RD team member 的话,请不要参考一下方法 定义我们的 a function In [84]: def a(): ...: def b(): ...: print("Hello b") ...: b() ...: print("Hello a") ...: In [85]: a() Hello b Hello a 来看看他 disassembled 之後会变什麽东西: In [86]: dis.dis(a) 2 0 LOAD_CONST 1 (<code object b at 0x109978c00, file "<ipython-input-84-59fd33a9812d>", line 2>) 2 LOAD_CONST 2 ('a.<locals>.b') 4 MAKE_FUNCTION 0 ... 下略 ... 其中的 code object b at 0x109978c00 是我们要的东西 然後 a 有个变数叫做 __code__,透过它,把我们要的东西抓出来 再用 eval 执行它 In [88]: eval(list(dis.get_instructions(a.__code__))[0].argval) Hello b 成功了,脑细胞也死光光了 .............. --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 220.143.20.81
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1526629846.A.94F.html







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:e-shopping站内搜寻

TOP