Найти - Пользователи
Полная версия: дескрипторы и декораторы и мета пробовал а PyCharm не поддается!
Начало » Инструментальные средства разработки » дескрипторы и декораторы и мета пробовал а PyCharm не поддается!
1 2 3 4 5
zavx0z
Всем доброго. Воткнулся в хрень и не могу оставить… Уже и дескрипторы и декораторы и мета пробовал, но не могу добиться автодополнения от PyCharm
Надо типа а-ля foreign_key и one_to_one как в models.Model Django. Надо, ох как надо автодополнение (широкая структура большой вложенности намечается), а к другой архитектуре кода не хочется прибегать. Так все лаконично и привычно.
Подскажите чем кто может.
 class Block:
    def __init__(self, obj, prop):
        self.obj = obj
        self.__prop = prop
class Elements:
    elems = "property_elems"
class Main:
    block_elems = Block(Elements, prop="prop_block")
elems = Main.block_elems.elems
zavx0z
Похоже Python не дает вариантов для PyCharm в этом случае. Уже все способы попробовал, какие в голову пришли, в книгах нашел, в YouTube, Google… ппц двум с половиной суток… досадно. Чтоб придумать то подобное
JOHN_16
менять архитектуру приложения потому что в IDE не работает автодополнение….. я запомню это.

Миллион раз обсуждалась основная тема - из за динамической типизации невозможно сделать полностью грамотное автодополнение (например как в VisualStudio при работе с C/C++ или Delphi и тп).
Конкретно в вашем случае я ниче не понял. Причем тут декораторы, мета … да и в коде вашем .elems не существует
zavx0z
JOHN_16
Причем тут декораторы, мета … да и в коде вашем .elems не существует
Мета и дискрипторы я не стал в коде показывать, все равно они не оправдывают ожидания. Хотел только показать связь в модели.

Рассмотрим как дескрипторы.

Есть основной блок Main, у него есть свойство block_elems. block_elems - класс дескриптор Block, в который передается объект Elements и параметр prop.
Имеем:
 Main.block_elems
Допустим, сейчас я расширил пример, и у объекта дескриптора, класса Elements, как-раз и имеется свойство elems, которое тоже является дискриптором класса ManyToOne с еще одним объектом Elem.
Тогда имеем:
 Main.block_elems.elems

А еще у Elements может быть любое другое свойство или аттрибут, типа того…
 Main.block_elems.elems_property

Ну и дальше по такому типу может быть очень глубоко.
 Main.block_elems.elems.text

Так вот ни каким методом я не могу затавить свойста торчать наружу с условием автодополнения.



Из этого примера видно для чего я еще пробовал использовать декораторы класса и мета. Нужно связать несвязанные классы, такие как Block и Elements, ManyToOne и Elem.
zavx0z
JOHN_16
менять архитектуру приложения потому что в IDE не работает автодополнение….. я запомню это.
Да, может и такое быть. Для меня основным приоритетом является удобное использование моделей для скорости написания основного кода приложения, где вся элементы вложенной структуры многократно взаимодействуют. Тем более что это должен быть фреймворк для множества проектов. И если по большой портянке в несколько тысяч строк искать отношения… или постоянно перемещаться по файлам в поисках связей… не продуктивно как-то получается и сулит получить кучу эксепшенов.
Хотелось бы конечно в таком виде как у Django, т.к. еще вторым в приоритете стоит задача лаконичного описания моделей с множественными свойствами и аттрибутами полей, ну и методов(куда без них).

ОСНОВНАЯ же задача передо мной стоит в многократном использовании моделей и всех их свойств в коде. Без автодополнения ну совсем не удобно. Не так ли?
zavx0z
JOHN_16
из за динамической типизации невозможно сделать полностью грамотное автодополнение
Возможно все… вот только еще пока никто не сделал.
FishHook
zavx0z
Есть такое понятие - хороший стиль программирования. Один из пунктов хорошего стиля - автодокументация кода. И питон не исключение, автодокументация кода в питоне делается так же как и в других языках - комментариями. А пайшарм понимает эти комментарии, более того он понимает несколько стилей этих комментариев. Я бы вам рекомендовал комментарии в стиле sphinx, пайшарм с ними работает замечательно.
zavx0z
FishHook
С документацией у меня все впоряде. Но чем документация поможет в моем случае?
- Автодополнение не заработает в этой модели благодаря документации.
- Документация не поможет в поиске динамических аттрибутов.
Или может я что-то не так понял, или Вы?
doza_and
zavx0z
Без автодополнения ну совсем не удобно. Не так ли?
Не согласен. Тема уже обсуждалась на этом форуме, многие разработчики склоняются к тому что автодополнение в питоне вообще не нужно и то что оно есть это дань привычкам тех кто использует компилируемые языки :).
Код в котором
zavx0z
Ну и дальше по такому типу может быть очень глубоко.
будет выглядеть так:
 adads.qeqwe.dfgd.qweq.dfgd.qweq.gjdlkgj.ry = adads.qeqwe.dfgd.qwep.gjdlkgj.ry 
adads.qeqwe.dfgd.qweq.gjdlkgj.re = adads.qeqwe.dfgd.qwep.gjdlkgj.re[2] 
Не думаю что это удобно. Я бы это назвал кошмар программиста. Такое скорее в java можно увидеть.

В ваших планах я вообще не увидел использования модулей и пакетов, используются только классы. Может это решит вашу проблему структуирования кода?

zavx0z
Возможно все… вот только еще пока никто не сделал.
Тоже не согласен. Вот у меня в одном приложении описания классов по сети с других машин грузятся по алгоритму с использованием шифрования. Как пичарм автодополнение сделает до того как приложение запущено и пройдена аутентификация пользователя? Никак. В общем случае возможно автодополенение в том случае когда вы уже выполнили приложение до определенной точки и вписываете текст программы именно в этом месте. Вы это имеете ввиду? Похоже нет. Просто технология написания программы в питоне может очень существенно отличаться от технологии C, C++, java и т.п. (также как отличаются технологии java и C++) .

Могу посоветовать посмотреть технологии Jupiter, Ipython, Wolfram Mathematica наконец.

zavx0z
doza_and
Я бы это назвал кошмар программиста.
Кошмар программиста - это когда на форуме задаешь один вопрос, а в ответ получаешь ответы которые только отнимают время. Если такая структура кода нужна, значит она удобна.
Для взаимодействия с элементами страницы удобен доступ вида
 MainPage.searche_frame.block_resultat.resultats.save_to_db()
Вот к примеру нужно зайти на адрес и кликнуть пагинатор:
MainPage.searche_frame.block_resultat.block_paginator.buttons[2].click()
Или лучше так?
 wd.get("http://www.wwwww.ww/www/www/www2352?page=1#post-173417")
searche_frame = wd.find_element_by_id("searche_frime_id")
self.wd.switch_to.frame(searshe_frame)
WebDriverWait(wd, 10).until(lambda driver: driver.find_elements_by_xpath("//locator")).click()
А потом уйти на другую страницу и сделать еще какие-то действия…. Вот это и есть кошмар.

Ну или так, если действия происходят без перезагрузки страницы, то можно сокращать.
 block_result = MainPage.searche_frame.block_resultat
block_result.resultats.save_to_db()
block_result.block_paginator.buttons[2].click()

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

doza_and
многие разработчики склоняются к тому что автодополнение в питоне вообще не нужно
Когда код такой структуры и вложенности, то автодополнение помогает для сокращения времени. Смотришь на страницу, знаешь что элемент в модели есть, а название забыл. Или забыл родительских элементов имена. А с автодополнением двигаешься и знаешь по дереву когда на лево пойти, когда на право и выбор есть из всех аттрибутов. Нет аттрибута, дополняешь модель, есть аттрибут, Enter и делов-то. Скорость увеличивается, интуитивность перемещения появляется.
А по поводу мнения, я тоже на vim просидел много времени, потому что многие разработчики говорили что это круто и PyCharm для обучения хорош. А когда пересел, то как с трактора в иномару.
doza_and
Вот у меня в одном приложении описания классов по сети с других машин грузятся
А у меня не грузится. Мы же в этой теме рассматриваем примеры на моем случае. Не надо расширять абстракции.
doza_and
я вообще не увидел использования модулей и пакетов, используются только классы
Это экспериментальный пример для меньшего напряга мозга на форуме. Если я разверну код который я написал в течении 3х дней эксперементируя различными подходами….
Как же с вами тяжело-то. Дельное уже может кто что посоветует, а?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB