今天碰到一个问题,需要获取并调用当前类中的有一定特征的函数,恰好发现了 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)
输出结果如下:
[, , ]
此时变成了一个个可以直接调用的函数,我们可以通过
print(promos[0]())
来调用第一个函数并打印结果~