python通过字符串来调用函数

博客介绍了Python中通过字符串调用函数的方法。除常规操作外,还介绍了eval函数,它能转换字符串、计算表达式、调用函数;locals和globals函数可基于字典访问局部和全局变量;getattr函数能获取对象属性值;operator的methodcaller函数对函数进行了封装。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

导读

有时候我们想要通过字符串来直接调用函数,方便通过输入的参数来直接控制调用的函数

常规操作
def function1():
    print("function1")

def function2():
    print("function2")

def function3():
    print("function3")


def call_fun_by_str(fun_str):
    if fun_str == "function1":
        function1()
    elif fun_str == "function2":
        function2()
    elif fun_str == "function3":
        function3()


call_fun_by_str("function2")

通过判断字符串是否等于函数名,然后再来决定调用的函数。看起来感觉有那么一点点的多余,python作为追求简洁的语言,还提供了另外几种不同的方式通过字符串调用函数的方法。

eval函数

python内置的eval函数可以将符合字典列表元祖格式的字符串转换成字典列表元祖

a = "{'a':'10','b':'20'}"
print(type(a),type(eval(a)))
b = "[1,2,3]"
print(type(b),type(eval(b)))
c = "(4,5,6)"
print(type(c),type(eval(c)))

还能对字符串格式的表达式进行计算

a = "10*20"
print(eval(a))
b = "pow(3,3)"
print(eval(b))

除此之外,它还能直接通过函数名的字符串来调用函数

def function1():
    print("function1")

def function2():
    print("function2")

def function3():
    print("function3")


def call_fun_by_str(fun_str):
    eval(fun_str)()


call_fun_by_str("function2")
locals函数和globals函数

localsglobals函数提供了基于字典的访问局部和全局变量的方式

  • locals函数:实际上没有返回局部名字空间,它返回的是一个拷贝。所以对它进行修改,修改的是拷贝,而对实际的局部名字空间中的变量值并无影响。
  • globals函数:返回的是实际的全局名字空间,而不是一个拷贝与 locals 的行为完全相反。
a = 1
def demo():
    x = 2
    #修改局部变量
    locals()["x"] = 200
    print(x)#2
#修改全局变量
globals()["a"] = 100
print(a)#100
demo()

通过locals和globals调用函数

def function1():
    print("function1")

def function2():
    print("function2")

locals()["function1"]()
globals()["function2"]()
getattr函数

getattr函数可以用来获取对象的属性值
参数介绍

  • object – 对象,参数可以是类对象模块名self
  • name – 字符串,对象属性
  • default – 默认返回值,如果不提供该参数,在没有对应属性时,将触发 AttributeError
class Demo(object):
    a = 100
    def fun1(self):
        print("fun1")
    def fun2(self):
        print("fun2")
    def fun3(self):
        #在类中调用另一个函数
        getattr(self,"fun2")()


demo = Demo()
#调用类中的函数
getattr(demo,"fun1")()#fun1
getattr(demo,"fun3")()#fun2
#获取类中的属性值
print(getattr(demo,"a"))#100
#调用一个不存在的属性
print(getattr(demo,"b"))
#对于不存在的属性给一个默认值,避免抛出异常
print(getattr(demo,"b",10))#10
operator 的methodcaller

methodcaller函数对getattr函数进行了封装,底层的call函数就调用getattr函数

class Demo(object):
    a = 100
    def fun1(self):
        print("fun1")
    def fun2(self):
        print("fun2")
    def fun3(self):
        #在类中调用另一个函数
        getattr(self,"fun2")()


from operator import methodcaller
demo = Demo()
methodcaller("fun1")(demo)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

修炼之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值