猿问

基于字符串的Python类型转换

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


def set_val_type(val, val_type):

    if val_type == 'bool':

        return bool(val)

    elif val_type == 'int':

        return int(val)


Qyouu
浏览 208回答 3
3回答

料青山看我应如是

您可以执行以下操作:def set_val_type(val, val_type):     return eval(val_type + '({})'.format(val))尽管这似乎是您正在寻找的内容,但不建议使用 eval。正如@pault 之前评论的那样,这似乎是一个 XY 问题

泛舟湖上清波郎朗

您可以创建需要处理的所有类型的字典。def set_val_type(val, val_type):    funcs = {'int': int, 'bool': bool}    return funcs[val_type](val)

翻翻过去那场雪

为了避免使用eval,并假设您只使用内置类型,您可以getattr()在内置模块上使用 a (如果您想确保不调用任何函数,您可以执行 an isinstance(user_provided_type_here, type)before。要允许全局范围内的任何类型,请使用 globals()[user_provided_type_name]完整示例:import builtinsdef 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.systemeval()不是 问题较少。
随时随地看视频慕课网APP

相关分类

Python
我要回答