3 回答

TA貢獻(xiàn)1772條經(jīng)驗(yàn) 獲得超8個(gè)贊
您可以執(zhí)行以下操作:
def set_val_type(val, val_type): return eval(val_type + '({})'.format(val))
盡管這似乎是您正在尋找的內(nèi)容,但不建議使用 eval。正如@pault 之前評(píng)論的那樣,這似乎是一個(gè) XY 問題

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超3個(gè)贊
您可以創(chuàng)建需要處理的所有類型的字典。
def set_val_type(val, val_type):
funcs = {'int': int, 'bool': bool}
return funcs[val_type](val)

TA貢獻(xiàn)2065條經(jīng)驗(yàn) 獲得超14個(gè)贊
為了避免使用eval,并假設(shè)您只使用內(nèi)置類型,您可以getattr()在內(nèi)置模塊上使用 a (如果您想確保不調(diào)用任何函數(shù),您可以執(zhí)行 an isinstance(user_provided_type_here, type)before。
要允許全局范圍內(nèi)的任何類型,請(qǐng)使用 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
有了這種訪問級(jí)別,一個(gè)來自非常壞消息的subprocess.Popen/ 。 也就是說,如果您的用戶輸入是可信的,則使用是os.system
eval()不是 問題較少。
添加回答
舉報(bào)