Справочная информация:
Я в основном запускаю скрипты python из командной строки в конвейерах, поэтому мои аргументы - это всегда строки, которые должны быть преобразованы в соответствующий тип.Я делаю много маленьких сценариев каждый день, и приведение каждого параметра к каждому сценарию занимает больше времени, чем нужно.
Вопрос:
Существует ли канонический способ автоматического ввода параметров приведения для функции?
Мой путь:
IЯ разработал декоратор, чтобы делать то, что я хочу, если нет лучшего способа.Декоратор - это автовыставка 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')