LINUX.ORG.RU

Как вы вообще разрабатываете на питоне?

 


0

3

Здравствуйте

Допустим, имеем такую структуру проекта

module1.py
pkg1/
    script.py

Сдержимое script.py:

import module1

Находясь в директории проекта выполняем:

$ python3 pkg1/script.py
Traceback (most recent call last):
  File "pkg1/script.py", line 1, in <module>
    import mylib
ImportError: No module named mylib

Я, конечно, извиняюсь за глупый вопрос, но как вообще писать код на этом?

★★★★★
Ответ на: комментарий от grem

В смысле не завезли?

В смысле их нет. Модули прибиты к файлам. Невозможно раскидать модуль по нескольким файлам или запилить подмодули в одном. Это вообще-то суровое ограничение, сильно затруднящее жизнь. Питонщики изворачиваются «пакетами», то есть хаками с файловой системой. Жалкое зрелище

bread
()
Ответ на: комментарий от I-Love-Microsoft

в линуксе нет ворда -> не в чем делать документы

Но ведь действительно не в чем.

есть куча других, не менее удобных блокнотов

bread
()
Последнее исправление: bread (всего исправлений: 1)
Ответ на: комментарий от bread

А зачем один модуль хранить в нескольких файлах? И зачем нужно хранить несколько подмодулей в одном? Чем последние лучше импорта определённый функций из модуля?

Не в рамках питона, а вообще.

grem ★★★★★
()
Последнее исправление: grem (всего исправлений: 1)

но как вообще писать код на этом?

Уровень вопроса «5 звезд».

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

А я не понимаю как так вышло, что все вышеотписавшиеся не знали про -m. Предлагали менять sys.path или юзать ipython

А я, например, не знал, хотя на python пишу довольно много и довольно больших проектов (то есть модули у меня там присутствуют, и не в единственном числе). То ли дело в том что знания у меня джуновские, то ли в том что ты какую-то наркоманию разводишь и так никто не делает - тебе надо script.py держать в «корне» (условно) проекта, а module.py - в каталоге под корнем. В общем это получилось как если бы ты при разработке на любом ЯП не библиотеку к проекту подключал, а наоборот в либе писал что ей надо использовать какой-то проект. Так что да, в нормальных условиях в тот же path лезть не нужно, но если хочется чего-то необычного - приходится изворачиваться.

micronekodesu ★★★
()

Вебмакаки из палаты мер и весов.

RazrFalcon ★★★★★
()

Как вы вообще разрабатываете на питоне?

Вот так: раз-раз-раз.

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

А если это внешний модуль, общий для нескольких проектов?

Ну так используй его как внешний модуль, не? Установи в virtualenv или просто куда-нибудь положи и установи PYTHONPATH.

За захардкоженый sys.path надо расстреливать из говномёта в 99% случаев.

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

Невозможно раскидать модуль по нескольким файлам или запилить подмодули в одном.

Это называется package. И да, чтобы потом не искать, куда очередная недообученная обезьяна запихала свой код, во всех приличных языках модули завязывают на файловую систему,

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

отписка

Отлична! А то ты надоедаешь с напоминаниями что меня вот вот забанят.

linuhs_user
()
── my_project
   ├── bin
   │   ├── project -> ../project
   │   └── starter.py
   └── project
       ├── init.py
       ├── module1
       │   ├── init.py
       │   └── module1.py
       └── module2
           ├── init.py
           └── module2.py

module1.py:

def module1func():
    print('Func called from module 1')

module2.py:

from project.module1.module1 import module1func


def module2func():
    module1func()

starter.py:

from project.module2.module2 import module2func

module2func()

~/my_project $ python ./bin/starter.py
Func called from module 1

Профит?

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

Потому, что это просто «вставка» содержимого одного файла в другой. >Попробуй из твоего «модуля» добавить функции и константы выборочно, >а не все содержащиеся в нём.

ты походу вообще не шариш в том, о чём говоришь. в хидерах объявления. а ненужные определение выкидываются lto.

Компилироваться опять же будет всё
содержимое, а не то, что хочется использовать.

типа питон умеен компелировать. хахаха, Лол :-)

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

В тех же C++ есть противники использования using namespase по ряду причин.

не тех кто топит за using namespace значительно больше по причине большего количества мозгов. хахаха Лол :-) да ты просто конь в пальто, даже боюсь упасть со стула, когда буду читать твой следующий комент.

anonymous
()

Я, конечно, извиняюсь за глупый вопрос

Глупости и невежеству не может быть извенений.

но как вообще писать код на этом?

Как и на любом языке, поскольку никакой язык не будет за вас искать модули в произвольных местах файловой системы, и особенно в текущей директории - с тем чтобы после очередного cd его поведение могло измениться непредсказуемо.

И нормальные люди хранят скрипты в корне проекта, а библиотеки в иерархии, а не наоборот как вы.

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

pip install -e все-таки лучше чем симлинки вручную

Можно корректно зарегистрировать скрипты и они будут в PATH в твоем virtualenv. Вместо «python ./bin/starter.py» будет просто «starter»

Можно проверить заодно, что setup.py корректен, а не только что код в конкретном файле работает. Сценарий использования ближе к проду.

Можно прицепить tox и всё будет ещё красивее.

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

Наверное, ты уже упал перед тем как писать, так как из твоего комментария сложно понять, рад ты за тех кто использует using namespase или сочувтвуешь им.

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

это и всё? а по канпеляцию в пистоне ничего не скажешь?

рад ты за тех кто

а какая разница? хочешь пиши, хочеш нет. я больше рад за себя, что не пишу на пистоне - не надо парить мозги динамической типизацией (или вернее отсутствуем статической).

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

Про компиляцию речь шла не о питоне.

Чтобы не парить мозг динамической типизацией достаточно осознать, что в питоне всё есть объект, даже переменные, и просто пользоваться. Никто ж не парит мозг используя шаблоны.

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

Чтобы не парить мозг динамической типизацией достаточно осознать ... и просто выгребать баги ведрами в рантайме.

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

чтобы потом не искать, куда очередная недообученная обезьяна запихала свой код, во всех недоязыках для макак модули завязывают на файловую систему

Как то так. Модули можно отображать на файловую систему, но только тупорылый прапорщик вроле гвидона будет навязывать такой «единственно верный» подход.

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

А потом в рантайме полно ошибок, из-за того что быдлокодер попутал объекты и дергает несуществующие методы, но узнаем мы об этом когда код будет работать, после внедрения.

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

Лорчую. Ещё ооп нет нормального с приватными методами, всякие «__init__» всюду. Да ещё и отступы с GIL.

Другое дело php в 7-й версии уже почти ява.

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

В тех же C++ есть противники использования using namespase по ряду причин

Огласите весь список, пожалуйста. От этого зависит стану ли я противником неймспейсов.

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

Как то так. Модули можно отображать на файловую систему, но только тупорылый прапорщик вроле гвидона будет навязывать такой «единственно верный» подход.

Ты из тех говнокодящих нытиков, которым обязательные отступы в питоне ограничивают творческое пространство?

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

А потом в рантайме полно ошибок, из-за того что быдлокодер попутал объекты и дергает несуществующие методы, но узнаем мы об этом когда код будет работать, после внедрения.

Нормальные люди в любых языках пишут тесты. Но ноющим говнокодерам же внедрять надо.

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

Да ладно?

https://imgur.com/a/EKI0u

$ cat test.py
from typing import Dict, Optional, Union

def foo() -> Dict[str, str]:
    return {1:1}

def bar(i: int) -> None:
    return i

bar('a')

$ mypy test.py 
test.py:4: error: Dict entry 0 has incompatible type "int": "int"; expected "str": "str"
test.py:7: error: No return value expected
test.py:9: error: Argument 1 to "bar" has incompatible type "str"; expected "int"

Более того тайп хиты можно генерить автоматически https://github.com/Instagram/MonkeyType и есть https://github.com/RussBaz/enforce

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

Отступы реально вредят. Из-за них питон такой убогий, хоть и динамический. Мог бы быть могучим как лисп, а по факту туп как бейсик, да еще и тормоз. Удивительно, как столь плохой инструмент стал таким популярным. Макаки инстинктивно тянутся к какашкам вероятно. Причуды эволюции.

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

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

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

Когда нет доводов, сразу вспоминают про отступы. А переменные начинать с $ или ; в конце строки это нормально 🧐

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

А ты типа нескучный? Ну расскажи чем хороши анальные отступы, например. И что тебе мешает их расставлять в любом другом ЯП.

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

Основной довод, что при использовании, например, двух пространств имён, при очередном обновлении этих библиотек может случиться так, что в них появятся функции с одинаковыми именами и набором входных параметров, но работающих немного по разному. Ну и без using namespace сразу видно, откуда вызывается функция.

Как пример,

using namespase std using namespace boost

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

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

Ну если ты так криво пишешь код, то выгребай вёдрами.

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

Нормальные люди в любых языках пишут тесты. Но

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

Нормальные люди тесты пишут для алгоритмов например, а не для проверки типобезопасности Лол :-)

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

monkeytype генерит аннотации типов автоматически для существующего кода.

Что значит генерит? В компил-тайме? Или это кодогенератор, которым никто в здравом не будет пользоваться доя старой кодовой базы?

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

Какие могут быть технические аргументы в споре об эстетических предпочтениях в синтаксисе

Вот GIL - это да, печальная история. Кто-то на ЛОРе кидал ссылку https://www.youtube.com/watch?v=MCs5OvhV9S4&app=desktop

После такого реально начинаешь задумываться, а не лучше ли серебрянная пуля - горутины

makoven ★★★★★
() автор топика
Последнее исправление: makoven (всего исправлений: 1)
Ответ на: комментарий от anonymous

Это как трассировщик. Запускаешь проект через него, он записывает где какие типы используются и может сгенерить stub файлы или добавить аннотации прямо в код.

Обычно достаточно запустить тесты через него.

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

Ну из-за отступов в питоне нет многострочных лямбд, например. Сильно затруднена кодогенерация, например. Такие вот аргументы. А что дают анальные отступы кроме крысоты и фельдфебельского порядка?

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

Конечно, вместо нормальной проверки компилятором/какой-нибудь проверялкой, которая шла бы вместе с ЯП надо в тестах писать проверку типов. Слава идиотам, что могу сказать. В общем, Python это не тот ЯП, который годится на что-то кроме сайтика, прототипа или модельки. Серьезную промышленную разработку на нем вести нельзя (и тут дело не в тормознутости языка), если конечно вы не мазохист. Кстати, сам факт появления автоматических инструментов говорит о том, что над инфраструктурой питона требуется работа напильником.

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.