循环通过python函数参数

时间:2015-10-22 00:01:06

标签: python

我有一个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

我希望para等于hp而不是HP。

4 个答案:

答案 0 :(得分:2)

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

  

注意不应修改此词典的内容;更改可能 1 不会影响解释器使用的本地和自由变量的值。

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

1 “may”可能就在那里,因为不是Cpython的实现可以以不同方式自由实现locals。更好的措辞可能是“不需要改变......”

在更高的层次上,拥有一个具有足够参数的函数可以“手动”小写,这很麻烦,有点“代码嗅觉”,可能意味着重构是有序的。

答案 1 :(得分:2)

没有必要弄乱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]

答案 2 :(得分: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'}

答案 3 :(得分:0)

修改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