You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:01:04