Рубрики
Без рубрики

[Переписать] Ссылка: двунаправленные псевдонимы в Python

Конструктивный опыт в обсуждении в Python-идеях и последней мысли о «ссылке», двунаправленной псевдонимы в Python. Теги с Python, идеи.

Hihi ~ Devs,

Прежде всего, я хотел бы общаться с тем, что Python-идеи – это очень открытое место для ваших идей и вкладов.

Уважаемые люди в дискуссии

Это был мой первый раз здесь среди разработчиков ядра Python, Python-идеи , место, чтобы предложить идею до почти всех Peps Начинается здесь. Это был очень конструктивный (и техничный, конечно) диалог. Учитывая, что я совершенно новичусь на развитие ядра ядра, я был впечатлен этими ответами. Я узнал много технических аспектов языка в течение 3-дневного разговора. И я знаю, что еще многое узнать больше!

Обсуждение (нить) в течение 4 дней становится неактивным сейчас и скоро будет заброшено. Я хотел бы оставить эту идею парням на любых языках программирования, не ограничиваемых Python. Вот мое реконструированное предложение как резюме. Оригинальное предложение – здесь и нить Отказ

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

Обозначение ссылки

Обозначение Ссылка И даже как называть это открытыми для изменений. На данный момент, если переменная ссылка с б. Я обозначу как A> или Ссылка A, B Отказ Чтобы разбить все, не играет в Отказ Чтобы открыть переменную, Unning a Отказ Ссылка можно проверить через Ссылки () Как глобал () и Местные жители () К дель и Unnings , используйте del_and_unlinks a Отказ @Link (A, B) Как декоратор для функциональных связанных параметров. Чтобы проверить ссылку переменной, используйте ака (а) Отказ

Ссылка может быть прикована.

A> такое же как и

a >< b
b >< c

Ссылка поведения

Поведение может быть упрощено как

a >< b
a = 1
print(b) # 1
b = 2
print(a) # 2

del a
print(b) # will raise NamedError, both were un-binded.

a = ['Cat', None]
assert a is b # True, both were rebinded.

Более сложные сценарии

Ссылка после назначения

Когда набор имен ссылается или ссылка на ссылку. Допускается только одна переменная (или имя). В противном случае ссылка будет неудачной и поднять Toomanyassignerror. . Таким образом, Ссылка не волнует порядок переменных.

x = 5
x >< y # or `y >< x` would be ok

a = 1
b = 'foo'
a >< b # raise TooManyAssignError

Бесплатная память после Unlinks

a >< b >< c
a = HighMemObject()

del a # free memory at once

b = HighMemObject()

unlinks b # unlink all but, all will keep referring to the `HighMemObject`.

del a # b, c still refer to the `HighMemObject`
del b # c still refer to the `HighMemObject`
del c # free memory

ссылка более или менее, как имущество запутанности в квантовой физике.

Обоснование

Языковый гладкий сдвиг [недавно добавлено 11/03/2020]

Предположим, вы идете с другого языка, как JS. Вы можете архивировать более быстрый переход с «ссылками». Я предоставим несколько примеров в Строкаул

"    Hi dude.      ".trim() // "Hi dude."
"COVID-19 symptoms are Fever, Cough, and Shortness of breath".includes("Fever") // true
str.trim >< str.strip
"    Hi dude.      ".trim() # "Hi dude."

str.includes >< str.contains
"COVID-19 symptoms are Fever, Cough, and Shortness of breath".includes("Fever") // True

Изменить имя переменной на протяжении всего сложного процесса

Легче обернуть голову вокруг. Если мы можем добавить еще одно значимое имя. Меньше когнитивной нагрузки для кодера и читателя. Мы полагаемся на меньшем количестве комментариев, чтобы отслеживать вещи.

Я подразумеваю, что я имею в виду, имею в виду, что я код.

students = School.list_students(year=4)
School.gruaduate(students)
students_graduated >< to_be_sentCertificates >< students

...

School.sendCertificates(students_graduated)

Разрешить читать от фрагмента/частичного числа без необходимости отслеживать изменения верхней переменной.

Это также может способствовать парню, который кодирует в интерактивных средах, таких как jupyter , дель однажды и бесплатные мем. Везде Нет необходимости отслеживать переменные к тому же объекту.

import pandas as pd

df2train = pd.read_csv('train.csv') # VERY Large DataFrame
df >< df2train 

...

df >< df_didEDA

...

df2train >< df_preprocessed

...

df >< df_trained
...

aka(df) # df, df2train, df_didEDA, df_preprocessed, df_trained

del df # del once and free mem. everywhere! >//<

Упростить псевдонимую

Вместо использования @имущество а также @ foo.setter Украшение и определить в __init__ так.

class PackageManager:
    packages = ['requests', 'loguru']

    @property
    def installed(self):
        return self.packages

    @installed.setter
    def installed(self, value):
        self.packages = value

    def remove(self):
        ...

    def __init__(self, ...)
        ...
        self.uninstall = self.remove

# monkey patching
PackageManager.uninstall = lambda x: print('uninstalled')
PackageManager.remove = lambda x: print('uninstalled')

Мы можем просто

class PackageManager:
    uninstall >< remove
    installed >< packages
    packages = ['requests', 'loguru']

    def remove(): 
        ...

# Plus >//<, one-stop service monkey patching
PackageManager.uninstall = lambda x: print('uninstalled')

Изменить неразрушающее/не питоновое название к лучшему имени

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

from selenium import webdriver

driver = webdriver.Firefox()
webdriver.find_element_by_name >< webdriver.get_element_by_name

elem = driver.get_element_by_name("q")

Многоязычный код

class Human:

    love >< 爱 >< любовь >< รัก >< 💞

    @link(you, вы, คุณ, 您)
    def love(self, you: 'Human'):
        self.soulmate = soulmate

    def code(self):
        return "import json"

    # link function name of similar term
    program >< code


# link class name of different languages
link Human, มนุษย์, 人的, человек, 👤

me = человек()
assert me.program() == me.code() # True


# monkey patch all at once!
人的.program = lambda x: "import this"
assert มนุษย์().program() == me.code() # True

[ Вероятно ,tooambitiousexception] Разрешить ненужное название на части указанного объекта

Я не уверен, что это должно быть частью Ссылка или не. Поскольку не все объекты могут назначить и т. Д… Образец будет

house = {'resident': {'count': 12}}
house['resident']['number'] >< n_resident
n_resident = 3
print(house['resident']['number']) # print 3

del_and_unlink house

Идея внедрения

Есть несколько обсуждений об этом. Я не могу понять механизм в деталях. Вот список

  1. Пространства имен Вещи -Chris Angelico и Andrew Barnert
  2. alias_identifier и установить поведение -Ричард МУСИЛ

В заключение, это не так просто, как мне кажется, лол 😂. Пока не говоря уже о производительности, нет твердого реализации этого.

  1. C ++ указатели на тот же адрес авто и
  2. К препроцессорной директивы ( #define ) Используется для определения макросов.
  3. Присвоение/присвоение Python: тот же объект в моменте привила.

Кредит: Cover Photo by Vincent Van Zalinge на Unsplash

Оригинал: “https://dev.to/circleoncircles/rewrite-link-bidirectional-aliasing-in-python-ekl”