问题描述
我有一个收到很多争论的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
我希望段等于马力而不是马力。
1楼
这是不可能的。 Python的不会修改函数名称空间中的名称。 根据文档:
注意 :此字典的内容不应修改; 变化可能1不影响由解释器使用的局部和自由变量的值。
唯一的解决方案是继续使用arguments
来访问值,或者用手将每个arguments
小写,或者传递可迭代的参数,而不是显式地命名每个参数。
其中可能有1个 “可能”,因为不是Cpython的实现可以自由地以不同的方式实现locals
。
更好的措词可能是“不需要更改即可影响...”
在较高的层次上,拥有一个带有足够参数的函数,以至于“手工”的小写繁琐是有点“代码异味”的,并且可能意味着重构是有序的。
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]
3楼
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'}
4楼
修改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