LINUX.ORG.RU

[wiki] Расширить бы и углубить

 


0

1

www.linux.org.ru/wiki/en/User:shimon/PythonMagic

Тут у меня пока что один рецепт, но помню, в свое время мне пришлось потратить много нервов, чтобы к нему прийти.

Если у вас есть аналогичные штуки (именно про Python), которые неочевидны, не описаны в документации, трудногуглимые, но вам известные, есть большая просьба не жадничать и выкладывать либо туда, либо сюда.

Или если вам кажется, что я хреновый писатель, не стесняйтесь улучшать страничку.

P. S. Вот бы подсветку синтаксиса на wiki...

★★★★★

Чистый поток сознания и абсолютно бесполезная страничка. Смысловая нагрузка в первых двух абзацах вообще отсутствует.

Не знаю какой документации ты ждёшь, про inspect итп есть отдельный раздел в доках питона.

Представленный код абсолютно ничего не делает и зачем оно может понадобится непонятно. Есть метаклассы, есть куча рецептов в гугле для конкретных примеров, а это просто месиво.

Ну и это отличный способ отстрелить себе ногу, проверял это на себе многократно.

Хочешь расширить сознание? Почитать про то как народ байт-код питона на лету декомпелирует, меняет и загружает обратно.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

> Представленный код абсолютно ничего не делает и зачем оно может понадобится непонятно.

Да вот почитай хотя бы, как zope.interface работает. То, что оно не нужно тебе, не значит, что оно не нужно никому.

shimon ★★★★★
() автор топика
Ответ на: комментарий от true_admin

> Есть метаклассы, есть куча рецептов в гугле для конкретных примеров

Можно сделать

class Foo:
    implements(SomeInterface)

расширяя язык под свои нужды.

А можно городить туеву хучу метаклассов, что отнюдь не способствует читабельности.

И, да, не нравится — сделай лучше, будь мужиком, блеять!

shimon ★★★★★
() автор топика
Ответ на: комментарий от shimon

То, что оно не нужно тебе, не значит, что оно не нужно никому.

да это ты так «опейсал». даже я не понимаю что к чему, хотя питон хорошо знаю.

почитай хотя бы, как zope.interface работает

что оно делает? Это не типа abstract base clases?

расширяя язык под свои нужды.

Тоже нифига не понятно. Это реализация private/public полей класса?

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

> что оно делает? Это не типа abstract base clases?

Это типа жабовских интерфейсов, плюс возможность сказать: дай мне список всех классов, реализующих интерфейс X.

> Тоже нифига не понятно. Это реализация private/public полей класса?

Можно и так.

Почитай, например, последний абзац, зачем мне такая штука была нужна.

class X:
    @public_api
    def public_function(self, *args):
        pass

    def nonpublic_function(self):
        pass

Потом я могу легко экспортировать методы, помеченные как @public_api, через какой-нить RPC удаленному узлу, который хочет их дергать (в результате nonpublic_function не засветится в списке). Этот узел строит на своей стороне объект-прокси, в результате чего в принципе становится пофигу, локально вызываются методы, или удаленно (рядом вполне может лежать локальный объект того же типа).

То есть мне надо было декоратором поменять не только свойства метода, но и свойства класса, в котором метод объявлен.

shimon ★★★★★
() автор топика
Ответ на: комментарий от baverman

> Прикольно. Интересно, как с этим у других имплементаций?

Самое прикольное, что других имплементаций я просто не видел.

Гугл выдает куски того же самого zope.interface, при этом там эти штуки не документированы — что _getframe, зачем _getframe, почему надо проверить на наличие __module__...

shimon ★★★★★
() автор топика
Ответ на: комментарий от true_admin

> скорее всего никак

А вот чем п-здеть почем зря, попробовал бы сперва, ыксперт доморощенный.

shimon ★★★★★
() автор топика
Ответ на: комментарий от shimon

А, понятно, магия в том чтобы через sys._getframe вытащить класс, да? Короче, почитай что делает inspect.

Никакой особой магией тут не пахнет, на stackoverflow очень много подобного. И я тут постил подобное в девелопмент и был посрамлён за такое надругательство на питоном :).

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

Ну тады дай кошерный пример того же самого с использованием inspect. Елки, я для этого топик и создавал.

shimon ★★★★★
() автор топика
Ответ на: комментарий от shimon

А вот чем п-здеть почем зря, попробовал бы сперва, ыксперт доморощенный.

вот и полезло из тебя говно, сразу видно кто чего стоит. А надо было взять и посмотреть есть ли inspect или нет. В jython, например, есть.

true_admin ★★★★★
()
Ответ на: комментарий от shimon

блеять, ну почитай уже доку. Хинт: inspect.currentframe(1).f_locals

Немного говнокода:

#!/usr/bin/env python3
import inspect
import re

def s(string):
    variables = re.findall("\$\{(\w+)\}", string, re.M)

    if not variables:
        return string

    f_locals = inspect.currentframe(1).f_locals
    for variable in variables:
        try:
            value = f_locals[variable]
        except KeyError:
            continue
        string = string.replace("${%s}" % variable, str(value))

    del f_locals
    return string


if __name__ == '__main__':
    x=1
    print(s("x=${x}"))

У меня много такого, включая извраты с ast.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

> блеять, ну почитай уже доку. Хинт: inspect.currentframe(1).f_locals

Папа: — Сына, а разве это не один хер?
Сына: — Ну, я так и сказал...

:-)

shimon ★★★★★
() автор топика
Ответ на: комментарий от shimon

Короче, извини если нагрубил, давай жить дружно. Чё-то я на взводе сегодня.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

Тока ты это, предназначение указывай, а то у тебя пример кода похож на штуки, которые я по пьяни на перле фигачу...

shimon ★★★★★
() автор топика
Ответ на: комментарий от shimon

наверняка sys._getframe вызывается...

Ааа. Я не к этому писал. Ты на вики написал что нет по этому вопросу документации. А я ответил что она есть к модулю inspect и, гораздо больше, в «python data model». Почитай data model, там есть ответы на очень многие вопросы, это, я бы сказал, основная дока по питону как языку.

true_admin ★★★★★
()
Ответ на: комментарий от shimon

а то у тебя пример кода похож на штуки, которые я по пьяни на перле фигачу...

да нормальный код :). Он делает string expansion, там в конце пример есть. Ничего более нормального не придумал. Хотел сделать частью синтаксиса, но с ходу вышло т.к. для этого надо патчить питон.

Посмотрел что у меня ещё есть, прям такого интригующего больше нету. Ну вот было с анализом исходников на лету через inspect.getsourcelines: [python][metaclasses] автоматическое создание слотов

true_admin ★★★★★
()
Ответ на: комментарий от maxcom

2maxcom: а ты не хочешь сделать подсветку синтаксиса как это обычно делают, через js? Суть метода в том что подключаешь одну js и она сама ищет на странице код(в <pre></pre>), сама определяет тип языка и сама раскрашивает. Т.е. всё сводится к подключению всего одного js. У меня вот такое используется: http://softwaremaniacs.org/soft/highlight/en/

true_admin ★★★★★
()
Ответ на: комментарий от shimon

Чё там понимать-то, getframe'ом получаем предыдущий фрейм, на __module__ проверяем ибо в каждый класс при создании автоматически добавляется такое поле. Поцоны и так это знают, без всяких доков ;) А тема интересная, да.

anonymous
()
Ответ на: комментарий от anonymous

> Поцоны и так это знают, без всяких доков ;)

С молоком матери всосали, да.

shimon ★★★★★
() автор топика
Ответ на: комментарий от maxcom

Честно скажу, запустил с большим трудом сайт. Щас уже времени копаться нету, займусь завтра.

true_admin ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.