为了账号安全,请及时绑定邮箱和手机立即绑定

基于字符串的Python类型转换

基于字符串的Python类型转换

Qyouu 2021-10-05 15:59:05
我如何编写此代码才能使其适用于给定的每种类型?def set_val_type(val, val_type):    if val_type == 'bool':        return bool(val)    elif val_type == 'int':        return int(val)
查看完整描述

3 回答

?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

您可以执行以下操作:

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

尽管这似乎是您正在寻找的内容,但不建议使用 eval。正如@pault 之前评论的那样,这似乎是一个 XY 问题


查看完整回答
反对 回复 2021-10-05
?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

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


def set_val_type(val, val_type):

    funcs = {'int': int, 'bool': bool}

    return funcs[val_type](val)


查看完整回答
反对 回复 2021-10-05
?
翻翻过去那场雪

TA贡献2065条经验 获得超14个赞

为了避免使用eval,并假设您只使用内置类型,您可以getattr()在内置模块上使用 a (如果您想确保不调用任何函数,您可以执行 an isinstance(user_provided_type_here, type)before。


要允许全局范围内的任何类型,请使用 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()不是 问题较少。


查看完整回答
反对 回复 2021-10-05
  • 3 回答
  • 0 关注
  • 207 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号