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

Python Guide для JS-DEV

Я использовал JavaScript для большей части моей карьеры, но недавно я начал работать в компании, которая … помечена Python, Node, JavaScript.

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

Шесть из одной, полдюжины другого

Во-первых, давайте посмотрим на аналогичные понятия с разными именами на двух языках.

Ошибки и исключения

Ошибки в JavaScript называются исключениями в Python. Они иначе идентичны каким-либо значимым образом.

Нуль и нет

null В JavaScript это Нет в питоне. Там нет эквивалента undefined в питоне.

Сокращенные ключевые слова

Некоторые ключевые слова в Python являются аббревиатурами фактических слов.

  • Строка называется ул ...| в питоне. Логический
  • называется Bool в питоне. еще если
  • называется Элиф в питоне. 🤯

Я застрял дольше, чем хотел признать первый раз, когда я пытался написать еще если Отказ Это странная quirk, но вы быстро адаптируетесь, если вы знаете, чтобы посмотреть на это.

Объекты и словари

Объекты в JavaScript называются словарями в Python. Есть два различия. Во-первых, точечная запись не работает в Python.

person = {"name": "Sherlock", "address": "Baker Street"}

print(person["name"]) # This works
print(person.name)    # This doesn't work

Другое различие в том, что Python не имеет эквивалента undefined в JavaScript. Это означает, что если вы попытаетесь получить доступ к неопределенному свойству, вы получите исключение.

person = {"name": "John", "title": "Doctor"}

print(person["address"]) # Throws KeyError: 'address'

Чтобы не разбиться всякий раз, когда вы хотите получить доступ к необязательному свойству, вы можете использовать .получать () . .получать () это метод, который возвращает значение ключа, если он существует в словаре. Если его нельзя найти .получать () Возвращает Нет Отказ Вы также можете дать .получать () Дополнительный параметр по умолчанию, который будет возвращен вместо Нет Если ключ неопределен.

person = {"name": "Mycroft", "occupation": "Government official"}

print(person.get('name')) # prints Mycroft
print(person.get('age')) # prints None
print(person.get('age', 35)) # prints 35

Кортежи и списки

В Python есть два эквивалентом массивов JavaScript. В большинстве случаев вы используете списки, и они наполняют ту же цель.

clues = ["chair", "safe", "saucer of milk"]

for clue in clues:
  print(f"{clue} is a helpful clue")

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

def get_nemesis():
  return ("James", "Moriarty", 1835) # Return a tuple

# User is a tuple here
nemesis = get_nemesis()
print(nemesis[0], nemesis[1]) # Prints James Moriarty
nemesis[0] = "John" # This throws an Exception

# You can destructure a tuple
(first_name, last_name, born) = get_nemesis()

# The parenthesis are optional when destructuring
first_name, last_name, born = get_nemesis()

Список (и Dict) понимание

Понимание списка является одной из самых особенности, если вы приходите из JavaScript. В JavaScript вы можете быстро составлять массивы, используя функции массива, такие как .карта () , .sort () и .filter () Отказ У Python есть пара тех функций массива, но они немного уродливы пользоваться. Вот пример удвоения только даже номеров из списка.

const numbers = [1, 2, 3, 4]

const result = numbers
  .filter(num => num % 2 == 0)
  .map(num => num + num)

Пример выше в JavaScript эквивалентен этому примеру ниже в Python:

numbers = [1, 2, 3, 4]

result = map(
    lambda num: num + num,
    filter(lambda num: num % 2 == 0, numbers),
)

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

numbers = [1, 2, 3, 4]

result = [
  num + num           # new value (map)
  for num in numbers  # list to iterate
  if num % 2 == 0     # filter
]

Есть четные справедливости словаря для создания словарей из списков (или других iTerables) быстро 🤩:

numbers = [1, 2, 3, 4]

result = {
  num: num % 2 == 0
  for num in numbers
}

# Results in {1: False, 2: True, 3: False, 4: True}

Параллельность

Эта тема слишком велика, чтобы прикрыть в этом посте, но приятно знать, что есть ловушки, на которые вы должны смотреть. В JavaScript это (почти) невозможно сделать любую блокировку задачи. Это позволяет узнать, что каждая используемая вами библиотека гарантированно обрабатывает параллелизм благотворно. И трудно вступить в тупики.

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

У Python есть два разных метода для обработки параллелизма. Вы можете использовать традиционные потоки OS. Кроме того, Python недавно добавил неблокирующую одну резьбовую асинхронную родную библиотеку под названием Asyncio. Это очень похоже на петлю события узла на поверхности, но есть некоторые различия.

Во-первых, библиотека намного более сложнее и низкоуровневая, чем у узла. Неблокирующие операции ввода/вывода – это собственная часть языка JavaScript ( на самом деле не языка, а среда выполнения ), и синтаксис чувствует себя очень родным. В Python вы получаете доступ к множеству низкоуровневых компонентов контура событий. Вы должны начать петлю события самостоятельно и в зависимости от того, есть ли вы внутри или снаружи цикла, вы должны использовать разные функции для управления контуром события. Может быть сложно запомнить различные причуды.

Во-вторых, поддержка Python для синхронных заявлений может быть значительным недостатком при использовании Asyncio. Если вы случайно вызовите заявление блокировки, вы блокируете целую нить. Вы должны быть осторожны и явно запустить все блокировки кода в «Executors».

Несмотря на то, что есть причуды, я все еще предпочитаю Asyncio для управления потоками. Вы можете узнать больше о Asyncio, просмотрев Это видео или читая Эта книга Отказ

Последний совет, чтобы помнить, никогда не смешивать асинсио и нити. Документация к Asyncio несовершенна, и документация по использованию потоков вместе с Asyncio не существует. Я потратил слишком много времени, пытаясь заставить его работать, чтобы попытаться усмешить их снова.

Лямбдас

Я люблю анонимные функции стрелки в JavaScript. Я использую их все время, особенно если я хочу небольшую функцию с 3-5 операторами. Python имеет аналогичную концепцию под названием лямбда функций, но у них один роковой недостаток. Лямбдас может содержать только одно утверждение. Так что невозможно иметь многослойную лямбду. Вам придется объявить надлежащую функцию для этих случаев. 👎

Управление пакетами и воспроизводимые среды

NPM – одна из лучших функций узла. Неоспоминается, что качество доступных пакетов в Python не так хорош. Кроме того, документация часто намного лучше и приятнее ищет пакетов JavaScript. Я очень подозреваю причину тому, что существует значительная перекрытие между разработчиками JavaScript и веб-разработчиками. 😅

Но более значительное препятствие не было наличием пакетов PIP. Это был фактический менеджер пакетов, который я пропустил больше всего. При использовании NPM вы устанавливаете пакеты локально для определенного проекта. Это означает, что вы можете иметь разные версии одной и той же библиотеки в разных проектах узла на вашем компьютере одновременно. С PIP вы можете устанавливать только пакеты во всем мире.

Это звучит глупо глупо, чем это. Python решил изоляцию с использованием другого метода. Лучше всего настроить виртуальную среду для каждого проекта Python. Вы явно сообщите свою оболочку, чтобы активировать виртуальную среду, и когда она активирована, набор глобальных пакетов полностью отделен от среды по умолчанию.

Несмотря на то, что это хорошо работает, я все еще борнируюсь и забыл активировать мою виртуальную среду часто и случайно установить библиотеки во всем мире все время. Я скучаю по тому, как легко использовать NPM. Две другие функции, которые я скучаю, – это сценарии NPM и хорошее управление версиями пакета.

Чтобы заменить PIP, я начал использовать Pipenv. Он управляет моей виртуальной средой и версиями пакетов, а также NPM. Он также поддерживает скрипты. Лучшая часть состоит в том, что не имеет значения, если я активировал виртуальную среду при запуске скриптов. Pipenv автоматически запускает их в моей виртуальной среде независимо.

Стандартная библиотека

У Python есть фантастическая стандартная библиотека! Богатая родная библиотека компенсирует отсутствие пакетов производства сообществ. Мне нравится найти родные библиотеки, которые решают мои проблемы, потому что я знаю, что мне не нужно сравнивать несколько библиотек открытых источников, как я должен делать с пакетами NPM.

Библиотеки узлов очень наклоны и предлагают необходимые собственные операции, которые должны быть частью стандартной библиотеки, как и предоставление операций ввода-вывода. Стандартные библиотеки Python часто перекрываются в функциональности, что неслышно в мире JavaScript.

Лучшим примером того, насколько обширные библиотеки являются, если вы Google «Получите текущий момент времени с помощью Python». Вы увидите Эта статья В лучших результатах. В статье предлагаются три различных метода, используя три различных стандартных библиотеки ( время , datetime , календарь ).

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

Оригинал: “https://dev.to/panprices/python-for-js-devs-lk7”