Skip to content

Что осталось как в Python

This content is not available in your language yet.

Хорошая новость для питониста: большая часть того, что вы уже умеете, переносится в Mojo дословно. Эта глава — про то, что менять в голове не придётся.

Вот программа, в которой нет ни одной конструкции, специфичной для Mojo. Питонист читает её без словаря:

familiar.mojo
def greet(name: String, greeting: String = "Привет") -> String:
"""Собирает приветствие. Значение по умолчанию — как в Python."""
return greeting + ", " + name + "!"
def main():
# Функции, значения по умолчанию и именованные аргументы
print(greet("Мир"))
print(greet(name="Mojo", greeting="Здравствуй"))
# Списки и генераторы списков
var squares: List[Int] = [i * i for i in range(5)]
for value in squares:
print(value, end=" ")
print()
# Словари доступны без импорта
var ages = Dict[String, Int]()
ages["Аня"] = 30
ages["Борис"] = 25
print("людей в словаре:", len(ages))
# Циклы, условия, break и continue
var total = 0
for i in range(10):
if i % 2 == 0:
continue
if i > 7:
break
total += i
print("сумма нечётных до 7:", total)
# Кортежи и множественное присваивание
var left, right = 1, 2
print("слева", left, "справа", right)
Результат

Привет, Мир! Здравствуй, Mojo! 0 1 4 9 16 людей в словаре: 2 сумма нечётных до 7: 16 слева 1 справа 2

Дальше — по пунктам, что именно здесь работает как в Python.

Отступы вместо скобок. Блоки задаются отступом, двоеточие открывает блок, пустые строки ни на что не влияют. Всё как вы привыкли.

Комментарии — через #.

Докстринги — тройные кавычки первой строкой в теле функции. Более того, расширение Mojo для VS Code умеет работать с примерами кода внутри докстрингов: подсвечивает их и проверяет.

def add(a: Int, b: Int) -> Int:
"""Складывает два числа."""
return a + b

Значения по умолчанию, именованные аргументы, возврат значения — без отличий:

def greet(name: String, greeting: String = "Привет") -> String:
return greeting + ", " + name + "!"
greet("Мир") # позиционно
greet(name="Mojo", greeting="Здравствуй") # по именам

Правило «обязательные аргументы идут перед аргументами со значением по умолчанию» тоже сохранилось.

if / elif / else, for ... in, while, break, continue — всё на месте. Даже редкая питоновская конструкция for ... else работает:

def main():
for i in range(2):
print(i)
else:
print("цикл завершился без break")

range() ведёт себя привычно: range(5), range(2, 10), range(0, 10, 2).

Литералы списков и генераторы списков (list comprehensions):

var squares: List[Int] = [i * i for i in range(5)]

Словари доступны сразу, без импорта:

var ages = Dict[String, Int]()
ages["Аня"] = 30

Конкатенация, повторение, привычные методы:

def main():
print("ab" + "cd") # abcd
print("-" * 5) # -----
print("Привет".upper()) # ПРИВЕТ
print(" x ".strip()) # x
var left, right = 1, 2
var point = (10, 20)
var x = point[0]

try / except / finally и менеджеры контекста работают привычно:

# внутри функции, помеченной raises
with open("data.txt", "w") as f:
f.write("привет")
try:
risky()
except e:
print("поймали:", e)

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

Синтаксис @имя над объявлением — тот же. Набор декораторов другой (@fieldwise_init, @staticmethod, @parameter), но выглядит всё привычно.

from std.collections.optional import Optional

Форма from ... import ... знакома, отличается только состав стандартной библиотеки. Часть типов — Int, Float64, Bool, String, List, Dict, SIMD, Tuple — доступна вообще без импорта.

Если библиотеки на Mojo ещё нет, берите питоновскую:

from std.python import Python
def main() raises:
var math = Python.import_module("math")
print(math.sqrt(16))
Результат

4.0

Это не «мостик на будущее», а рабочий механизм: доступны NumPy, pandas, matplotlib и всё остальное, что установлено в вашем окружении. Подробно — в главе Вызов Python из Mojo.

🎯 Проверь себя

Почему `List` требует указания типа, а в Python список — нет?

Список в Python хранит ссылки на объекты, и объекты могут быть любыми. В Mojo список хранит сами значения подряд в памяти, поэтому компилятору нужно знать, сколько байт занимает элемент. Отсюда List[Int] вместо просто list.

Что из этого списка НЕ работает в Mojo: генераторы списков, for/else, f-строки, `with open`?

Не работают только f-строки. Остальное — генераторы списков, for ... else и менеджеры контекста — переносится из Python без изменений.

Теперь — самое важное отличие: что придётся делать иначе и почему.

Примеры проверены на Mojo 1.0.0

Тексты курса — CC BY-NC-SA 4.0, код примеров — Apache 2.0