我有以下方法声明:
def method(alpha, size=10, logged_in=False, interactions=False):
if not isinstance(logged_in, bool):
logged_in = str(logged_in).lower() in ['true']
if not isinstance(interactions, bool):
interactions = str(interactions).lower() in ['true']
需要 if
语句,因为例如,如果我传递 interaction=",
作为参数(因此,我传递一个字符串)。虽然上面的方法可以解决问题,但我想知道是否有一种更优雅的方法来实现它(请注意,除了 interactions
将被错误地设置为 True
False”logged_in
和 interactions
之外,我还有很多 bool 参数,并且我还有一些 int
和 float
参数。这里如何使用装饰器?一个装饰器可以用于所有 bool
参数吗?如何使用?我做了一个通用的(即支持 bool
、float
、int
、string
)?我找到了答案向this提问可能有用,但仍然想检查是否有更好的方法。
最佳答案
你可以尝试这样的事情。
def bool_fixer(func):
table = {"true": True, "false": False}
def wrapper(*args, **kwargs):
for key, val in kwargs.items():
if isinstance(val, str) and val.lower() in table:
kwargs[key] = table[val.lower()]
return func(*args, **kwargs)
return wrapper
@bool_fixer
def method(...):
do something
在装饰器发挥其魔力之后,所有字符串“true”和“false”将变成它们的 python bool
等效项,您可以跳过 方法中的所有检查
函数。
如果您希望它也涵盖ints
和floats
:
import re
def converter(func):
patterns = {r"\d*": int, r"\d*?\.\d*": float}
table = {"true": True, "false": False}
def wrapper(*args, **kwargs):
for key, val in kwargs.items():
if isinstance(val, str):
if val.lower() in table:
kwargs[key] = table[val.lower()]
continue
for pattern in patterns:
if re.match(pattern, val):
kwargs[key] = patterns[pattern](val)
return func(*args, **kwargs)
return wrapper
或
def converter(func):
table = {"true": True, "false": False}
def wrapper(*args, **kwargs):
for key, val in kwargs.items():
if isinstance(val, str):
if val.lower() in table:
kwargs[key] = table[val.lower()]
elif val.isdigit():
kwargs[key] = int(val)
elif re.match(r"\d*?\.\d*", val):
kwargs[key] = float(val)
return func(*args, **kwargs)
return wrapper
关于python - 类型转换(同一类型的多个参数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72119294/