при вводе пользователем, они могут потенциально получить удаленное выполнение кода, введя правильную полезную нагрузку.

Я в основном запускаю скрипты на Python из командной строки в конвейерах, поэтому мои аргументы - это всегда строки, которые должны быть приведены к соответствующему типу. Я делаю много маленьких сценариев каждый день, и приведение каждого параметра к каждому сценарию занимает больше времени, чем нужно.
Вопрос:

Есть ли канонический способ автоматического ввода параметров приведения для функции?
Мой путь:

Я разработал декоратор, чтобы делать то, что я хочу, если нет лучшего способа. Декоратор - это автовыставка fxn ниже. Декорированный fxn в этом примере - fxn2. Обратите внимание, что в конце блока кода я передал 1 и 2 в виде строк, и если вы запустите скрипт, он автоматически добавит их. Это хороший способ сделать это?
РЕДАКТИРОВАТЬ: Для тех, кто приходит сюда и хочет обновленную и краткую рабочую версию, перейдите сюда

def estimateType(var):
    #first test bools
    if var == 'True':
            return True
    elif var == 'False':
            return False
    else:
            #int
            try:
                    return int(var)
            except ValueError:
                    pass
            #float
            try:
                    return float(var)
            except ValueError:
                    pass
            #string
            try:
                    return str(var)
            except ValueError:
                    raise NameError('Something Messed Up Autocasting var %s (%s)' 
                                      % (var, type(var)))

def autocast(dFxn):
    '''Still need to figure out if you pass a variable with kw args!!!
    I guess I can just pass the dictionary to the fxn **args?'''
    def wrapped(*c, **d):
            print c, d
            t = [estimateType(x) for x in c]
            return dFxn(*t)
    return wrapped

@autocast
def fxn2(one, two):

   print one + two 

fxn2('1', '2')      

https://github.com/sequenceGeek/cgAutoCast

И вот также быстро работающая версия на основе выше:

Это "актерский состав", а не "каста"

def boolify(s):
    if s == 'True' or s == 'true':
            return True
    if s == 'False' or s == 'false':
            return False
    raise ValueError('Not Boolean Value!')

def estimateType(var):
    '''guesses the str representation of the variables type'''
    var = str(var) #important if the parameters aren't strings...
    for caster in (boolify, int, float):
            try:
                    return caster(var)
            except ValueError:
                    pass
    return var

def autocast(dFxn):
    def wrapped(*c, **d):
            cp = [estimateType(x) for x in c]
            dp = dict( (i, estimateType(j)) for (i,j) in d.items())
            return dFxn(*cp, **dp)

    return wrapped

######usage######
@autocast
def randomFunction(firstVar, secondVar):
    print firstVar + secondVar

randomFunction('1', '2')

Ответы на вопрос(6)

Ваш ответ на вопрос