当前位置: 代码迷 >> python >> 遍历python函数参数
  详细解决方案

遍历python函数参数

热度:57   发布时间:2023-06-13 15:14:33.0

我有一个收到很多争论的python函数。 我想将所有函数论点更改为小写。 我有以下代码:

functionOne(para, paraa, parab):
    arguments = locals()
    print arguments
    for keys in arguments:
       arguments[keys] = str(arguments[keys]).lower()
       print arguments[keys]
    print para

随着输出:

{'para':'HP', 'paraa':'MA', 'parab':'aM'}
hp
ma
am
HP

我希望段等于马力而不是马力。

这是不可能的。 Python的不会修改函数名称空间中的名称。 根据文档:

注意 :此字典的内容不应修改; 变化可能1不影响由解释器使用的局部和自由变量的值。

唯一的解决方案是继续使用arguments来访问值,或者用手将每个arguments小写,或者传递可迭代的参数,而不是显式地命名每个参数。

其中可能有1个 “可能”,因为不是Cpython的实现可以自由地以不同的方式实现locals 更好的措词可能是“不需要更改即可影响...”


在较高的层次上,拥有一个带有足够参数的函数,以至于“手工”的小写繁琐是有点“代码异味”的,并且可能意味着重构是有序的。

无需惹恼locals() 如果您的函数只有位置参数,则不应有太多,因此您可以一个一个地更改它们。

functionOne(para, paraa, parab):
    arguments = (para, paraa, parab)
    print arguments
    para, paraa, parab = map(str.lower, arguments)
    print para

如果您的函数将具有更大的任意数量的参数,请使用*

functionOne(*args):
    print args
    args = tuple(map(str.lower, args))
    print args[0]
para = para.lower()
paraa = paraa.lower()
parab = parab.lower()

您编写的循环适用于构造的列表,而不适用于原始参数。 这是完整的更改:

def functionOne(para, paraa, parab):
    arguments = locals()
    print arguments
    for keys in arguments:
        arguments[keys] = str(arguments[keys]).lower()
        print arguments[keys]
    para = para.lower()
    paraa = paraa.lower()
    parab = parab.lower()
    print locals()

functionOne('HP', 'MA', 'aM')

提供输出:

{'parab': 'aM', 'paraa': 'MA', 'para': 'HP'}
am
ma
hp
{'keys': 'para', 'parab': 'am', 'paraa': 'ma', 'arguments': {...}, 'para': 'hp'}

修改locals()的返回字典是未定义的行为。 它不会做你想要的。 我可以建议改用装饰器:

from functools import wraps
def lower_args(f):
    @wraps(f)
    def wrapper(*args, **kwargs):
        args = list(args)
        for i, a in enumerate(args):
            if isinstance(a, basestring):
                args[i] = a.lower()
        for key, val in kwargs.items():
            if isinstance(val, basestring):
                kwargs[key] = val.lower()
        return f(*args, **kwargs)
    return wrapper

@lower_args
def functionOne(para, paraa, parab):
    print para