python - 类型转换(同一类型的多个参数)

标签 python python-3.x types casting

我有以下方法声明:

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_ininteractions 之外,我还有很多 bool 参数,并且我还有一些 intfloat 参数。这里如何使用装饰器?一个装饰器可以用于所有 bool 参数吗?如何使用?我做了一个通用的(即支持 boolfloatintstring)?我找到了答案向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 等效项,您可以跳过 方法中的所有检查 函数。

如果您希望它也涵盖intsfloats:

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/

相关文章:

python - 如何从 3D numpy meshgrid 中提取 2D 平面

python - Excel 日期到 Python 并返回到 excel

javascript - 如何从 Python 执行 JavaScript 代码?

sql-server - 解释 SQL Server 中 sys.objects 中的类型代码

javascript - Vue 2 - 如何在 Prop 中设置默认数组类型

haskell - 实现相同功能的不同类型的映射列表?

python - Windows 中的 os.remove() 给出 "[Error 32] being used by another process"

python - 如何让 2 个客户端在都连接到会点服务器后直接相互连接?

python - "Phrase"停用词在 sklearn/nltk 中被忽略

python - PyQt 类不适用于第二次使用