×Закрыть

Python. __rtruediv__ чи__truediv__

Доброго часу доби, панове!
Почав розбиратись з бібліотекою (маст хев) pathlib.
Натрапив на кусок коду:

from pathlib import Path
outpath = Path.cwd() / 'assets' / 'fonts' / 'arrial' / 'ArialMT.ttf'
current_dir = Path.cwd()
Як таке, через слеш, в своєму класі забабахать? Дякую.
👍НравитсяПонравилось0
В избранноеВ избранном0
LinkedIn

Похожие топики

Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

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

os.path.join() выглядит намного приятнее, еще и места меньше займет за счет пробелов.

Как насчет

pkt = IP(dst="192.168.5.1") / UDP() / DNS(rd=1,qd=DNSQR(qname="www.slashdot.org"))

Отличный пример почему не надо :-). Можно же и: pkt = IP(dst="192.168.5.1") > UDP() > DNS(rd=1,qd=DNSQR(qname="www.slashdot.org")), зачем создавать perl если он уже есть?

Посмотреть можно в исходных текстах самого модуля pathlib. У меня в Windows, например, это файл C:\Program Files\Python39\Lib\pathlib.py
Дальше смотреть определение класса PurePath. Там переопределены оба метода — как __truediv__, так и __rtruediv__.

Просто не делай так, если хочешь писать нормальный, а не говнокод.

Я один не понял для чего это вообще нужно?

Чтобы писать проще было.
Для чего оно еще?

Это понятно))
как по мне это равносильно
#define BEGIN {
#define END }
Можно, но зачем? Брать кровь коллег на анализ пока кровоточат глаза?

Гарний приклад того коли перегрузка операторів не потрібна

Process.cwd() + ‘/path/to/your/file.ttf’

Ну високонавантажуваних проектах я б так писав. Просто хотілось розібратись як саме цей меджік працює.

Направление слешей зависит от ОС. При перегрузке оператора это можно скрыть.

Віндоуз розуміє форвард слеші під якимсь енвайронментом, під нодою точно норм

Розуміє на вході і в стандартному WinAPI. Але 1) не всюди (не в префіксах усяких UNC), 2) сам формує тільки з \.

Який саме Віндовс, коли він з’явився, і коли писали цю бібліотеку в Пітоні

ой сложна, нащо взагалі під вінду писати щось)

Вообще-то правильнее было бы использовать os.path.join()

ikr, це ж форум а не продакшн. В прод піде os-agnostic path.join авжеж

Можна спробувати так

class A:
    def __init__(self, initial_str=''):
        self._initial_str = initial_str

    def __truediv__(self, divisor):
        return A(self._initial_str + '/' + divisor)

    def __str__(self):
        return self._initial_str


a = A('initial/path') / 'arial' / 'arial.ttf'

print(a)

# initial/path/arial/arial.ttf

UPD:
Github CPython source — викликається таки

__truediv__

github.com/...​ae929/Lib/pathlib.py#L966

О, те що дохтур прописав. Щиро дякую.

Блин , до сих пор не люблю пайтон, вот посмотрел на код,,, какой тип у переменной, в конкретной точке, хрен поймешь.

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

там нет переменных, там указатели на области памяти, где лежат данные :)

Словарь это внутри объекта (поля и методы) и то только по умолчанию, можно менять.
А в общем случае любая «переменная» это ссылка на объект (даже если это просто число).

А как менять и что это значит? Типа под низом С++ и список полей константный, как у интов всяких?

Ну если ты пишешь

class Buka:
  foo = 0
  bar = None

у тебя будет динамический состав полей (foo, bar будут всегда, но можно добавлять сверх этого). Это чуть упрощая, но сейчас пойдёт.

А если ты скажешь
class Buka:
  __slots__ = ('foo', 'bar')

то кроме foo и bar других полей не будет позволено. Хочешь больше — плоди субкласс. Зато вместо мапы полей — список и по нему будет быстрее бегать (как минимум часть обращений превращается в индексные).

В то же время можно, например, так:

def foo2(self):
  return 2

class A:
  def foo(self):
    return 1

a = A()
a.foo = foo2
a.foo()

поменял метод на ходу у одного объекта, не меняя ничего в классе.

И так далее.

Цена за это — считай, любой доступ к полю или методу делается через мапу имя атрибута -> ссылка на реализацию. Есть оптимизации этого (объявления в самом классе, спец. флаги присутствия особых методов и т.п.), но не сильно меняющие остальное.

Вот на этих лукапах (каждый — хэш строки, поиск в корзинах, сравнение на точную строку и т.п.) и идёт основная задержка по сравнению с компилируемыми языками.

Вообще не знал про __slots__. Спасибо!

Насколько я помню (если за 5 лет ничего не поменялось) в Пайтоне как раз типы есть.
Только они нигде явно не фигируруют при определении или инициализации переменной.

и их наверняка можно менять динамически

там просто імена живуть окремо від змінних, якщо так можна сказати. тобто ім’я «х» дійсно можна зв’язати з числом 10, а через кілька рядків перезв’язати з якимось лістом. але те, до чого прив’язане ім’я, має цілком визначений тип. наприклад

x = 3
y = "yo"
x + y # ERROR
видасть помилку, треба в явному виді кастувати
x = 3
y = "yo"
str(x) + y # OK
в мене про це є чуть-чуть в моїй лекції (www.youtube.com/...​IYo9-1l4XYhrIyS6A&index=2), але я не впевнений, чи буде зрозуміло, бо я ще трохи як би то сказати... ще вчусь нормально читати лекції ))

так, пишуть, що __class__ read-only. Я думав, що його теж можна міняти в рантаймі.

Небольшое исследование показало (Питон 2.7):
1) Атрибут инстанса __class__ можно менять в рантайме
2) При этом все переменые и методы инстанса, унаследованные от оригинального класса пропадают и заменяются словарем нового класса
3) Если перезаписать у инстанса переменную или метод, унаследованный от класса, он сохраняется после изменения атрибута __class__

У 3.x то же самое, можно менять.
Но из-за (3) полноценная реализация этого может иметь неожиданные проблемы, увы.

формально так, згоден, але я собі навіть не можу уявити, де би хтось використовував таку техніку. для мене це щось з розряду #define private public

Перегрузка операции деления?

Да. Магічний метод.

Як таке, через слеш, в своєму класі забабахать?

А як воно в них в сорцах забабахано?

Куріння сорців нічого мені не відкрило, мабуть я дуж тупий.

Треба на результат cwd() дивитись

Я колись трохи дивився в Джанго, зрозумів, що там перегружено усе, що можливо, і закрив)

А там по іншому не можна. Легасі код.

Flask краще для простих задач. Зручно і можна дуже швидко підняти аплікуху.

Подписаться на комментарии