鱼C论坛

 找回密码
 立即注册
查看: 800|回复: 8

[已解决]如何同时访问嵌套函数里的多个函数

[复制链接]
发表于 2020-4-19 20:43:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
代码如下
def funOut():
    def funIn1():
        print('宾果!你成功访问到我啦!1')
    def funIn2():
        print('宾果!你成功访问到我啦!2')
    return (funIn1, funIn2)

我想通过
funOut()()
同时访问funIn1()和funIn2()
报如下错误
TypeError: 'tuple' object is not callable

为什么
最佳答案
2020-4-19 20:45:19
本帖最后由 qiuyouzhi 于 2020-4-19 20:49 编辑

返回的是一个元组,你得这样:
funOut()[0]()
funOut()[1]()
这样可以分别访问,但是要同时访问就得在函数里
动动手脚,还可以用多线程。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-19 20:45:19 | 显示全部楼层    本楼为最佳答案   
本帖最后由 qiuyouzhi 于 2020-4-19 20:49 编辑

返回的是一个元组,你得这样:
funOut()[0]()
funOut()[1]()
这样可以分别访问,但是要同时访问就得在函数里
动动手脚,还可以用多线程。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-19 20:45:21 | 显示全部楼层
这涉及到多线程,比较麻烦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-19 20:51:58 | 显示全部楼层
本帖最后由 _2_ 于 2020-4-19 21:31 编辑

就拿你说的这个来
funOut() 返回的是一个由 funIn1 和 funIn2 组成的元组
>>> funOut()
(<function funOut.<locals>.funIn1 at 0x0000000002E71550>, <function funOut.<locals>.funIn2 at 0x0000000002E715E0>)
>>> # 返回的是函数的地址
>>> # 因为只是调用了 print() , 并没有返回任何内容 

(... , ...)() 这样调用是错误的,所以 Python 会报错

@永恒的蓝色梦想  感谢指出,已经纠正
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-4-19 21:18:53 | 显示全部楼层
_2_ 发表于 2020-4-19 20:51
就拿你说的这个来
funOut() 返回的是一个由 funIn1() 和 funIn2() 的返回值组成的元组

funOut 绝对不会返回 (None,None)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-4-19 21:27:18 | 显示全部楼层
def funOut(funIn1: bool, funIn2: bool):
    def funIn1():
        print(1)
    def funcIn2():
        print(2)
    if funIn1:
        return funIn1()
    if funIn2:
        return funIn2()

你可以试试用参数完成这个操作,
方便以后外部调用:
>>> funOut(funIn1=True, funIn2=False)
1
>>> funOut(funIn1=False, funIn2=True)
2

但内部函数多了就不能这样干了,
会增加很多参数,
还是要你自己想想怎么在内部实现
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-4-19 21:29:55 From FishC Mobile | 显示全部楼层
python不支持异步,所以这个想法可以忽略了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-19 21:33:39 | 显示全部楼层
wp231957 发表于 2020-4-19 21:29
python不支持异步,所以这个想法可以忽略了

那 aynic 是干啥的......
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-19 21:52:22 | 显示全部楼层
import threading
lock = threading.Lock()

def funOut():
    def funIn1():
        #lock.acquire()
        print('宾果!你成功访问到我啦!1')
        #lock.release()
    def funIn2():
        #lock.acquire()
        print('宾果!你成功访问到我啦!2')
        #lock.release()
    return (funIn1, funIn2)


def main():
    t_1 = threading.Thread(target=funOut()[0](), args=())
    t_2= threading.Thread(target=funOut()[1](), args=())
    t_1.start()
    #t_1.join(5)
    t_2.start()
    #t_2.join(5)


if __name__ == '__main__':
    main()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-26 16:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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