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