А как мне динамически создать функцию с определенными аргументами?
Сейчас у меня f(args, *kwargs), но о ней непонятный хелп и наличие обязательных параметров приходится руками делать.
У меня генерится куча таких функций с разными параметрами.
лямбды предлагали уже?
TLemur, йеп
а FunctionType?
TLemur, ноуп
Вот это похоже на нужное, но не осилил
едрить
норм такое колдунство.
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.
def func(позиционный_аргумент1, позиционный_аргумент2, ключевой_аргумент1=значение, ключевой_аргумент2=значение)
SetazeR, грубо: из файла у меня грузится список параметров. Есть реальная функция, работающая с *args. Я хочу иметь именованную функцию уже с конкретными параметрами.
Tishka17, саммоню TLemur в тред
Так я в динамике их должен задать
Tishka17, я не догнал что ты хочешь сделать, можешь пример дать?
SetazeR, то есть есть функция f(*args) и есть генератор функций. Вот я хочу вызвать gen("name", "arg1") и чтобы она вернула функцию как будто она name(arg1), но по сути работающую как f
питон - не функциональный язык
Tishka17, какое забористое и сильное колдунство.
в нормальных языках это обычные практики
a13, щас я тупо юзаю
*args
и**kwargs
и в__doc__
пишу что надо. Но приходится руками состав проверятьTishka17, не, ну можно канеш заюзать лямбду, но оно неименованное будет https://docs.python.org/3/t...a#lambda-expressions
в питоне лямбды неполноценные
a13, ¯_(ツ)_/¯
Я с таким колдунством ещё не сталкивался. Хотелось бы посмотреть на практическую реализацию.
из рабочего кода(вроде бы ничего nda-ного тут нет):
Ничего не понял
a13, и как это работает?
хорошо работает, в ынтырпрайзных продакшнах
a13, в смысле каким образом это работает? что тут происходит?
генерятся функции-генераторы генераторов функций для строки без изменений (indentity) и с транслитерацией (str-tr)
внутре просто матчинг регулярного выражения (pregexp)
a13, жесть какая.
Так оно может сгенерировать функцию с двумя аргументами или с тремя в зависимости от аргументов?
конкретно это - нет, я тут просто показал человеку, зачем нужно вообще генерировать функции, а так - наздоровье (правда тут уже придётся макросами, а не функциями. если в scheme, конечно)
сопсна, первая функция просто делает враппер для того, чтобы одним махом использовать её и для обычной сторки и для измененнной
второе определение декларирует функции string-conv-gen-tr
string-conv-gen таким образом
где tr - функция трансляции строки
re-fmt - регулярка, которая, в общем случае определяет, в каком месте
нужно матчить оттранслированную строку s (начало, конец, середина,
пофиг)
регулярка задаётся при генерации, окончательной функции, которая имеет
вид
ну т.е. просто задаётся строка, транслируется и матчится.
Смысл колдунства (хотя какое колдунство, обычная функциональная
практика, как уже сказал) - одним махом нагенерить 8 (или даже больше,
ща уже не помню) функций однотипного вида. Меньше копипасты - меньше
потенциальных ошибок.