如何在Python中直接将函数参数转为小写(非函数体内实现)
解决Python参数自动转小写的问题
嘿,我懂你想要实现的是自动将函数的字符串参数转为小写的功能对吧?先说说你最开始尝试的def foo(str(arg).lower()):这种写法——在Python里,函数定义的参数列表不允许直接对参数做这种实时处理,这属于语法错误,所以肯定没法运行起来~
不过你后来写的装饰器思路完全是对的!先把你给出的装饰器代码贴出来:
def to_lowercase(function): def wrapper(*args): return function(*[x.lower() if isinstance(x, str) else x for x in args]) return wrapper
这个装饰器的工作逻辑很清晰:
- 它接收一个函数作为参数,返回一个包装函数
wrapper wrapper会捕获传入的所有位置参数*args,遍历每个参数:如果是字符串类型,就调用.lower()转小写,其他类型保持原样- 最后把处理后的参数传给原函数并返回结果
你可以这样使用它,就能实现你想要的效果:
@to_lowercase def foo(arg): print(arg) foo('LOL') # 输出: lol foo(456) # 输出: 456(非字符串参数不受影响)
如果你的函数还需要处理关键字参数,咱们可以把装饰器再优化一下,同时支持位置参数和关键字参数的处理:
def to_lowercase(function): def wrapper(*args, **kwargs): # 处理位置参数 processed_args = [x.lower() if isinstance(x, str) else x for x in args] # 处理关键字参数 processed_kwargs = { key: val.lower() if isinstance(val, str) else val for key, val in kwargs.items() } return function(*processed_args, **processed_kwargs) return wrapper
测试一下关键字参数的情况:
@to_lowercase def greet(greeting, name): print(f"{greeting}, {name}!") greet('HELLO', name='BOB') # 输出: hello, bob!
你之前说尝试装饰器时返回的要么是生成器要么是列表,大概率是没正确把处理后的参数解包传给原函数,或者在包装函数里误返回了参数列表本身(而不是原函数的调用结果)。现在这个装饰器就完全能达到你想要的效果啦~
内容的提问来源于stack exchange,提问作者Sir DrinksCoffeeALot
相关产品推荐
相关产品推荐

