基于字符串的Python类型转换

时间:2019-01-07 20:18:42

标签: python types

如何编写此代码,使其适用于给定的每种类型?

def set_val_type(val, val_type):
    if val_type == 'bool':
        return bool(val)
    elif val_type == 'int':
        return int(val)

3 个答案:

答案 0 :(得分:0)

您可以执行以下操作:

def set_val_type(val, val_type):
    return eval(val_type + '({})'.format(val))

using eval is not recommended就是您要找的内容。 @pault之前评论过,这似乎是XY问题

答案 1 :(得分:0)

您可以创建需要处理的所有类型的字典。

def set_val_type(val, val_type):
    funcs = {'int': int, 'bool': bool}
    return funcs[val_type](val)

答案 2 :(得分:0)

为避免使用eval,并假设您仅使用内置类型,可以在内置模块上使用getattr()(如果要确保不调用任何函数,则可以可以先执行isinstance(user_provided_type_here, type)

要在全局范围内允许任何类型,请使用globals()[user_provided_type_name]

完整示例:

import builtins

def set_val_type(val, val_type);
    user_type = getattr(builtins, val_type)  # possibly replace with globals()[val_type]
    if not isinstance(user_type, type):
        raise TypeError(f'{user_type} is no a type.')
    return user_type(val)

为什么使用eval()(通过不受信任用户输入):

def set_val_type(val, val_type):
    return eval(val_type + '({})'.format(val))

evil_val_type = 'bool'
evil_val = 'exec("import os\\nos.chdir(os.path.sep)\\nprint(os.getcwd())")'

print(set_val_type(evil_val, evil_val_name))
'False'  # yes, this actually works error-free

在这种访问级别下,一个只是来自很多坏消息的subprocess.Popen / os.system
就是说,如果您的用户输入受到信任,那么使用eval()并不是很容易。