Python 中 globals() 函数的使用

今天碰到一个问题,需要获取并调用当前类中的有一定特征的函数,恰好发现了 Python 内置的 globals() 函数

globals() 的定义:返回一个字典, 表示当前的全局符号表。 这个符号表始终针对当前模块(对函数或方法来说, 是指定义它们的模块, 而不是调用它们的模块)。

如下示例,我只想调用函数名以 _promo 结尾的函数,但是我不确定具体方法名和函数个数的情况下怎么办呢?这时候我们可以用 globals() 函数来实现,注意示例中 main 函数中的代码部分

def zero_promo():
    return 0

def one_promo():
    return 1

def two_promo():
    return 2

def hello():
    print("Hello")

if __name__ == '__main__':
    promos = [name for name in globals()]
    print(promos)

输出结果如下:

['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', '__file__', '__cached__', 'zero_promo', 'one_promo', 'two_promo', 'hello']

前面打印的都是一些内置函数,我们不关注,我们只关注最后面四个我们自己定义的函数,那么我只想调用某一类型的函数,比如后缀是 _promo 结尾的怎么办呢?很简单,加个过滤条件:

if __name__ == '__main__':
    promos = [name for name in globals() if name.endswith("_promo")]
    print(promos)

输出结果如下:

['zero_promo', 'one_promo', 'two_promo']

问题来了,我得到了我需要调用的函数名,但是是 str 类型的,那我怎么执行呢?很简单,简单修改一下代码

if __name__ == '__main__':
    promos = [globals()[name] for name in globals() if name.endswith("_promo")]
    print(promos)

输出结果如下:

[<function zero_promo at 0x0000013872FE2E18>, <function one_promo at 0x00000138735D5730>, <function two_promo at 0x00000138735D57B8>]

此时变成了一个个可以直接调用的函数,我们可以通过

 print(promos[0]())

来调用第一个函数并打印结果~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。