V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
u2gign
V2EX  ›  Python

求助循环里如何调用方法名

  •  
  •   u2gign · 2018-12-05 18:54:22 +08:00 · 1538 次点击
    这是一个创建于 1959 天前的主题,其中的信息可能已经有所发展或是发生改变。
    a1,a2,a3.. 是方法名
    之前写的程序这样
    threading.Thread(target=self.run, args=(a1, *args)).start()
    threading.Thread(target=self.run, args=(a2, *args)).start()
    threading.Thread(target=self.run, args=(a3, *args)).start()
    ...
    改为循环调用
    for i in range(1,num):
    threading.Thread(target=self.run, args=(a+str(i), *args)).start()
    报这个错误 TypeError: unsupported operand type(s) for +: 'int' and 'str'

    调用的方法名 还不能是字符串,这种情况
    大神如何解决
    6 条回复    2018-12-06 12:36:06 +08:00
    ipwx
        1
    ipwx  
       2018-12-05 18:55:37 +08:00   ❤️ 1
    getattr(sys.modules[__name__], 'a{}'.format(i))
    ipwx
        2
    ipwx  
       2018-12-05 18:56:08 +08:00
    话虽如此,但还是建议你做一个 function_map = {'a1': a1, 'a2': a2} 这样
    ipwx
        3
    ipwx  
       2018-12-05 18:56:24 +08:00   ❤️ 1
    或者干脆 function_list = [a1, a2] 这样
    u2gign
        4
    u2gign  
    OP
       2018-12-06 09:34:22 +08:00
    谢谢哈
    wkx556874
        5
    wkx556874  
       2018-12-06 12:32:07 +08:00
    a+str(i) 是否 指向的位置 和 a1 指向的位置一样?
    如果不一样 args 肯定是不能接收这个参数的

    我个人理解 (可能是错误的) 是 a1 是指向 函数的一个对象
    而 你循环里的是 一个'a1'..'a2'.. 是有区别的.



    threading.Thread(target=self.run, args=(a+str(i), *args)).start() 里面的 a 是什么? 字符串? 还是什么, +str(i), 是想做字符串拼接 然后 动态的 a1 a2 a3 么?
    这种情况 是不能这样操作 字符串拼接的
    应该用 list, list 可以接收 函数 为成员, 把你的要用的函数全部放进 list 里面 (这一步很有说法 )

    再调用的时候 for 循环 list[i] 就可以了 此时 args 接收的就是一个函数的引用
    wkx556874
        6
    wkx556874  
       2018-12-06 12:36:06 +08:00
    总的来说 你要确保你在循环里 调用的是一个 方法的引用 也就是方法名
    而不是其他的 比如 'a1' 一个像方法名的字符串 这是肯定不行的
    至于怎么去确保不调错, 我推荐自己去摸索
    我也是新手 也说不清楚 还可能是错误的.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3430 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 12:05 · PVG 20:05 · LAX 05:05 · JFK 08:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.