А как мне динамически создать функцию с определенными аргументами?
Сейчас у меня f(args, *kwargs), но о ней непонятный хелп и наличие обязательных параметров приходится руками делать.
У меня генерится куча таких функций с разными параметрами.
в нормальных языках это обычные практики
Tishka17, не, ну можно канеш заюзать лямбду, но оно неименованное будет https://docs.python.org/3/t...a#lambda-expressions
в питоне лямбды неполноценные
a13, ¯_(ツ)_/¯
Я с таким колдунством ещё не сталкивался. Хотелось бы посмотреть на практическую реализацию.
a13, щас я тупо юзаю *args
и **kwargs
и в __doc__
пишу что надо. Но приходится руками состав проверять
из рабочего кода(вроде бы ничего nda-ного тут нет):
(define trs-values
(compose values* (curryr map (list str-tr identity))))
(define-values (string-conv-gen-tr string-conv-gen)
(trs-values
(lambda (tr)
(lambda (re-fmt)
(lambda (s)
(pregexp
(format (string-append "(?i:" re-fmt ")")
(tr s))))))))
Ничего не понял
a13, и как это работает?
хорошо работает, в ынтырпрайзных продакшнах
a13, в смысле каким образом это работает? что тут происходит?
генерятся функции-генераторы генераторов функций для строки без изменений (indentity) и с транслитерацией (str-tr)
внутре просто матчинг регулярного выражения (pregexp)
a13, жесть какая.
Так оно может сгенерировать функцию с двумя аргументами или с тремя в зависимости от аргументов?
лямбды предлагали уже?
TLemur, йеп
сопсна, первая функция просто делает враппер для того, чтобы одним махом использовать её и для обычной сторки и для измененнной
второе определение декларирует функции string-conv-gen-tr
string-conv-gen таким образом
(lambda (re-fmt)
(lambda (s)
(pregexp
(format (string-append "(?i:" re-fmt ")")
(tr s)))))
где tr - функция трансляции строки
re-fmt - регулярка, которая, в общем случае определяет, в каком месте
нужно матчить оттранслированную строку s (начало, конец, середина,
пофиг)
регулярка задаётся при генерации, окончательной функции, которая имеет
вид
(lambda (s)
(pregexp
(format (string-append "(?i:" re-fmt ")")
(tr s))))
ну т.е. просто задаётся строка, транслируется и матчится.
Смысл колдунства (хотя какое колдунство, обычная функциональная
практика, как уже сказал) - одним махом нагенерить 8 (или даже больше,
ща уже не помню) функций однотипного вида. Меньше копипасты - меньше
потенциальных ошибок.
а FunctionType?
TLemur, ноуп
конкретно это - нет, я тут просто показал человеку, зачем нужно вообще генерировать функции, а так - наздоровье (правда тут уже придётся макросами, а не функциями. если в scheme, конечно)
едрить
Не знаю как они помогут
Вот это похоже на нужное, но не осилил
Ништяк! Щас буду пробовать
норм такое колдунство.
Nico-izo, неплохо. А я в прошлый раз подумал, что раз CodeType
требует codestring, то проще сразу eval
-ом сделать, все равно процесс один и тот же.
Сделать, чтобы хелп выдавал нужное, получилось. И даже дефолтное значения вроде съел из массива. Но при вызове такой функции интерпретатор просто закрывается
Tishka17, вероятно что-то проебал в параметрах
Количество параметров - это argcount? Или еще что-то надо менять?
partizan, ЧЯДНТ?
def f(*args):
print args
def f2(args):
print "f2:", args
return f(args)
y_args = ["x","y","z"]
co = f2.__code__
new_co = CodeType(
len(y_args),
co.co_nlocals,
co.co_stacksize,
co.co_flags,
co.co_code,
co.co_consts,
co.co_names,
tuple(y_args),
co.co_filename,
"f",
co.co_firstlineno,
co.co_lnotab)
new_y = FunctionType(new_co, globals())
new_y.func_defaults=tuple([None]*(len(y_args)))
new_y(1,2) #работает
new_y(z=1, y=2, x=3) #не работает - TypeError: f() got multiple values for keyword argument 'z'
может про **kwargs
забыл?
Пишешь не на том языке, конечно же.
надо было на перле, да? // я надолго запомню этот кодогенератор в dbtools.
больной ёж
Очевидно, что на плюсцах. // DBTools, конечно, говно, потому что всё вообще говно, но на самом деле не такое страшное.
плюсцы же тоже говно
Менее говно, чем петушон. Даже явка менее говно, чем петушон, хотя и большее говно, чем perl.