Python 协程, 我这样写有没有问题, 通过字符串调用函数

2020-04-22 18:59:34 +08:00
 jin7
import asyncio


async def do_foo(what):
    return what


async def do_bar(what):
    return what


async def main(param):
    result = asyncio.gather(do_foo(param), do_bar(param))
    await result
    print(result.result())


asyncio.run(main('123'))


# 我这样写有没有问题, 通过字符串调用函数
async def question(param):
    coros = []
    funs = ['do_foo', 'do_bar']
    for fun in funs:
        coros.append(globals()[fun](param))
    result = asyncio.gather(*coros)
    await result
    print(result.result())


asyncio.run(question('123'))
2039 次点击
所在节点    Python
7 条回复
ClericPy
2020-04-22 19:05:25 +08:00
前期没有大问题, 后期可能会有小问题

从设计角度说, 可以搞一个类专门放方法, 然后使用的时候, getattr(obj, 'string')()
ClericPy
2020-04-22 19:07:48 +08:00
看起来像策略模式
black11black
2020-04-22 19:11:33 +08:00
搞封装不是问题,问题一个是污染全局变量,第二是有些封装方式不适合高可用环境,比如 getattr,还有你的 globals,根据需求自己选实现方法吧。
ClericPy
2020-04-22 19:12:54 +08:00
上面口误, 看了下代码好像是责任链... 溜了散步去了
jin7
2020-04-24 10:29:27 +08:00
搞明白我类似代码的 bug 了
aaronhua
2020-04-27 21:36:21 +08:00
我也是这样搞的,只在入口的地方,通过读取配置调用函数。主要问题是调用不够直观,才一两个人写的项目这个问题不大。
jin7
2020-04-28 10:58:43 +08:00
@aaronhua #6 好的咯

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

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

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

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

© 2021 V2EX