- *nopython *python *говноСемантика выражения a = b (отсутствие аналога operator=) сильно усложняет дела. В частности, я не могу сходу придумать, как бы спустить в python-скрипт параметры из сишечки/плюсцов так, чтобы после
def SomeFunc (someCObject): someCObject = anotherObject
внешний спущенный объект тоже изменился. Или чтобы хотя бы для него op= вызвался.from idead, 11 months ago
Replies (66)
- @0xd34df00d:@demiazz Не внешний объект. someCObject — это же референс. Ты меняешь референс, все.
- @demiazz:@0xd34df00d а тебе надо чтобы именно сомесиобжект изменился? А не стал указывать на другие данные которые имеют те же значения?
- @0xd34df00d:@demiazz Мне надо это отловить. Я допиливаю Qross — хреноту для использования скриптовых языков из плюсцов — и мне было бы неплохо после выхода из питоновой функции (возврата из соответствующей функции в C API) знать, что параметры изменились внутри функции, и как-то это дело обработать.
При этом, если someCObject.someMethod сделает все как надо (это обертка над соответствующим методом в исходных плюсцах, и все), то для = это не катит — никаких operator= там не вызовется. Поэтому, кажется, и придется доопределять всякие __set__. Вопрос в том, как это сделать универсально в момент закидывания объекта в пейтон. - @demiazz:@0xd34df00d сейчас сломается мозг. Сейчас. Погоди малость вьеду.
- @demiazz:@0xd34df00d так. Ну в принципе да. Через системные методы делается. Можешь заглянуть в си апи языка еще. А узнать что в функции изменилось — ну как ты себе представляешь? Функция должна сообщать о работе с параметрами. Но зачем? Это интерпретатор. Ему не важно менялись значения или нет. Это самому скрипту и программисту знать. Так что пробуй __set__
- @demiazz:@0xd34df00d у питона ведь несколько другая философия. У плюсов есть перегрузка присвоения. В питоне это сделано через сет. Но это более выгоднее, удобнее и мощнее для динамического языка как питон. Не пытайся привести логику работы его к плюсам ;)from Jimm, 11 months ago, in reply to /6
- @Heni:@0xd34df00d ну во-первых, я бы очень сильно подумал нужно ли отслеживать a = b, и если действительно нужно, то можно для функции переопределить словари globals, locals и т.д. на их уровне как раз и отслеживаются такие измененияfrom Psi+00522AF9, 11 months ago, in reply to /6
- @Kxepal:@0xd34df00d если ты в функции что-то присвоил переменной, то она будет существовать только в области видимости этой функции и никак не повлияет на то, что за ней.
так что присвоение ты можешь отследить, вернув этот самый параметр a
def some_method(a,b):
a = b
return a
и потом сравнив a переданное с a полученным.from ASHDARH0C439F07, 11 months ago, in reply to /7 - @0xd34df00d:@Heni Раскрою чуть больше. Есть приложение (например, браузер), у него есть плагины на скриптовых языках. Предположим, функция someFunc вызывается, когда браузеру требуется сгенерировать user-agent string для некоего сайта — этакий своеобразный хук.
Писать
def hook (useragent, url):
useragent = "foo"
легче на порядок, чем
def hook (useragent, url):
useragent.clear ()
useragent.append ("foo")from idead, 11 months ago, in reply to /11 - @0xd34df00d:@Kxepal А если там может обновиться больше, чем одно значение? Возвращать tuple? А если там несколько точек выхода? А если скриптописатель забудет написать return или вернет в тупле параметры не в том порядке? Это как-то костыльно и неудобно для пейсателей скриптов, чую.from idead, 11 months ago, in reply to /12
- @Kxepal:@0xd34df00d легче, только вот useragent в первой функции будет локальным и не повлияет на переданное значение, тогда как во второй это будет все тот же объектfrom ASHDARH0C439F07, 11 months ago, in reply to /13
- @demiazz:@0xd34df00d делай так чтобы плагины на питоне писались в стиле питона. Во втором случае у тебя список. Причем тогда строка?from Jimm, 11 months ago, in reply to /13
- @0xd34df00d:@Kxepal Дададда. А моя цель — сделать так, чтобы это повлияло на глобальное значение. Или как принято такие вещи делать python-style? Изменить переданное значение так, чтобы изменение было видно извне?from idead, 11 months ago, in reply to /16
- @Kxepal:@0xd34df00d есть global, но это не самый "правильный" вариант. твой второй пример в духе питона т.к. ты работает с одним и тем же объектом, соответственно в нем можешь и фиксировать изменения.from ASHDARH0C439F07, 11 months ago, in reply to /18
- @0xd34df00d:@Kxepal Хорошо, а если мне нужно будет таким образом изменить объект, для которого трюк в стиле clear/append не прокатит? Например, QWidget какой?from idead, 11 months ago, in reply to /19
- @Kxepal:@0xd34df00d можно оборачивать декоратором, но помоему проблема несколько надумана. пусть делают с переменной что хотят, главное чтобы когда оно понадобилось, оно имело верное значение.from ASHDARH0C439F07, 11 months ago, in reply to /15
- @Kxepal:@0xd34df00d не в курсе про QWidget, но если он не умеет ресетиться/переопределять свое значение, значит создавай новый объект, либо перегружай QWidgetfrom ASHDARHC848DC6A, 11 months ago, in reply to /20
- @Kxepal:@0xd34df00d только если вернешь новый QWidget, не думаю что просто __init__ может всегда сработать, да и некрасивоfrom ASHDARHC848DC6A, 11 months ago, in reply to /23
- @Heni:@0xd34df00d ну тогда либо нужно помудохаться с locals, либо все-таки писать
def hook(url, context):
context.useragent = "foo"
а отслеживание полей объекта контекст — уж не трудно сделатьfrom Psi+00522AF9, 11 months ago, in reply to /13 - @0xd34df00d:@ulidtko Где здесь присваивание аргументу, блеать?from idead, 11 months ago, in reply to /29
- @ulidtko:@0xd34df00d нету и не нужно. Забудь о плюсцах, здесь объекты чутка другие; в плюсцах ты возвращаешь значение, модифицируя объект по переданной ссылке — в питоне создаёшь блестящий новый и возвращаешь return'ом.from lunatic asylum, 11 months ago, in reply to /30
- @0xd34df00d:@ulidtko Хуй. Придется делать врапперы чуть более интеллектуальными и для плюсовых объектов, переданных по **, ожидать тупл.from idead, 11 months ago, in reply to /31
- @0xd34df00d:@ulidtko Какая еще генерация. Список функций, которые надо оборачивать, определяется в рантайме. Считай, там рантайм-кодогенерация на плюсцах. По крайней мере, выглядит оно именно так )from idead, 11 months ago, in reply to /33
- @0xd34df00d:@demiazz Уныловато, кое-что легче на пейтоне делать.from idead, 11 months ago, in reply to /40
- @demiazz:@0xd34df00d тогда найди нормальную привязку. Извини, но ты пытаешься питон привязать как плюсы. Чтобы на нем писать как на плюсах. Ибо привык. Лучше найди кого кто привязывал питон. Или на крайний случай есть буст. Все же лучше.from Jimm, 11 months ago, in reply to /41
- @demiazz:@0xd34df00d и есть еще SWIG. ;) код пикьюти посмотри за одно. Их код.from Jimm, 11 months ago, in reply to /41
- @0xd34df00d:@demiazz Там много Qt/C++-магии. Человека, одновременно шарящего в философии пейтона и в плюсцах, я как-то не нашел.
А буст и свиг/сип — то компил-тайм. А мне надо много чего делать в рантайме.from idead, 11 months ago, in reply to /42 - @demiazz:@0xd34df00d ну вот тогда бери буст. В конце концов в рантайме поможет сам интерпретатор. Выдели просто апи именно к своим личкрафтам. Тогда и привязать легче будет по идее.from Jimm, 11 months ago, in reply to /44
- @0xd34df00d:@demiazz Апи нету строго определенного. Оно тоже в рантайме узнается.from idead, 11 months ago, in reply to /45
- @demiazz:@0xd34df00d че та ты хочешь сделать непонятное. О.Оfrom Jimm, 11 months ago, in reply to /46
- @demiazz:@0xd34df00d может хорош выдумывать. Сделай хотя бы какое нить ;)from Jimm, 11 months ago, in reply to /48
- @0xd34df00d:@demiazz Сейчас уже есть. Без модификации переданных параметров только )from idead, 11 months ago, in reply to /49
- @demiazz:@0xd34df00d а ты не пробовал спереть апи у других? Сделать похожее для каждой из части комбайна?from Jimm, 11 months ago, in reply to /51
- @0xd34df00d:@demiazz Плагин, отвечающий за поддержку скриптовых плагинов, ничего не знает об API других плагинов же.from idead, 11 months ago, in reply to /52
- @0xd34df00d:@demiazz Как? Стандартизовывать АПИ плагинов для плагинов? Говно же!from idead, 11 months ago, in reply to /57
- @demiazz:@0xd34df00d стандартизируй. Ядро пускай дает апи, а к нему уже привязывать плагины. А то плагин для поддержки плагинов это уже уебищно. Честно. :) ИМХОfrom Jimm, 11 months ago, in reply to /58
- @0xd34df00d:@demiazz Хаха. Ядро не может заранее знать обо всех апи и обо всех плагинах с их апи. Какая-нибудь рсс-читалка будет иметь свой апи, и так далее.
Почему же уебищно? )from idead, 11 months ago, in reply to /59 - @demiazz:@0xd34df00d ядро это совокупность подсистем. А плагины привязываются к ним. Через апи же. Например браузер может быть оперируемой.from Jimm, 11 months ago, in reply to /60
- @0xd34df00d:@demiazz Нет. Ядро обеспечивает загрузку подсистем и базовые механизмы связи между ними — через сообщения. Впрочем, можно хуки реализовать сообщениями, да.from web, 11 months ago, in reply to /61
- @demiazz:@0xd34df00d ну в принципе да. Но апи я считаю должно быть стандартизировано. Может конечно быть в какой то мере изменяемым в рантайме, но все равно эта изменчивость должна быть простой, и легко понятной и ограниченной.from Jimm, 11 months ago, in reply to /62
- @0xd34df00d:@demiazz Дык откуда ядру или плагину-поддержке пейтона знать об API какого-нибудь там конкретного браузера или рсс-читалки той же?from idead, 11 months ago, in reply to /63
- @demiazz:@0xd34df00d в смысле? Плагин содержит в себе скрытую логику. И должен предоставлять вывод и управление собой через само ядро. Значит ядро по идее должно предоставить АПИ для возможности ввода и вывода информации для плагина. Ну и какой нить механизм обмена сообщениями между плагинами, и ядром. Как то так, как вариант.from Jimm, 11 months ago, in reply to /64
- @0xd34df00d:@demiazz Да. Только то, что умеет плагин и все такое — вопрос плагина и плагинов для него, но не ядра. Разные браузеры могут предоставлять разные фичи и иметь разный API, и это логично.from idead, 11 months ago, in reply to /65
- @demiazz:@0xd34df00d какое то ощущение чтобы либо говорим об одном и том же, либо ходим вокруг, но к конкретно чему то подойти не можем %)from Jimm, 11 months ago, in reply to /66
- @0xd34df00d:@demiazz Трактат о взаимодействии плагинов: 0xd34df00d.mefrom idead, 11 months ago, in reply to /67
- @demiazz:@0xd34df00d надо будет глянуть. Я сейчас просто видимо сам в джанге весь %) у самого тут тодо полный и не знаю за что хвататься :( мозг кипитfrom Jimm, 11 months ago, in reply to /68