Дата актуальности: 21:42 (по московскому времени)
Что делает этот скрипт?
Программа имитирует классический расклад «Кельтский крест» из 10 карт, объясняет их позиции и выводит краткие толкования. Всё работает прямо в браузере, в консоли или на сервере Flask. Никаких сторонних библиотек не требуется — только стандартная библиотека Python 3.
Архитектура за 2 минуты
- Card — класс, описывающий масть, ранг и «значение» карты.
- Deck — колода 78 карт (22 Старших Аркана + 56 Младших).
- Spread — класс, который «тасует» колоду и раскладывает 10 карт по позициям.
- Interpreter, набор заранее подготовленных толкований на русском языке.
Полный код (готов к запуску)
Скопируйте в файл tarot.py и запустите: python3 tarot.py
import random
from dataclasses import dataclass
from typing import List, Dict
@dataclass
class Card:
name: str
arcana: str # 'major' или 'minor'
suit: str # 'wands', 'cups', 'swords', 'pentacles', ''
rank: str # 'Ace', '2'..'10', 'Page', 'Knight', 'Queen', 'King', ''
upright_meaning: str
reversed_meaning: str
def meaning(self, reversed_flag=False):
return self.reversed_meaning if reversed_flag else self.upright_meaning
class Deck:
major = [
"Шут", "Маг", "Верховная Жрица", "Императрица", "Император",
"Иерофант", "Влюблённые", "Колесница", "Сила", "Отшельник",
"Колесо Фортуны", "Справедливость", "Повешенный", "Смерть",
"Умеренность", "Дьявол", "Башня", "Звезда", "Луна", "Солнце",
"Суд", "Мир"
]
suits = ["Жезлы", "Кубки", "Мечи", "Пентакли"]
ranks = ["Туз"] + [str(i) for i in range(2, 11)] + ["Паж", "Рыцарь", "Королева", "Король"]
def __init__(self):
self.cards: List[Card] = []
self._build
def _build(self):
# Старшие
for name in self.major:
self.cards.append(Card(
name=name,
arcana="major",
suit="",
rank="",
upright_meaning=f"Прямое значение {name}",
reversed_meaning=f"Перевёрнутое значение {name}"
))
# Младшие
for suit in self.suits:
for rank in self.ranks:
self.cards.append(Card(
name=f"{rank} {suit}",
arcana="minor",
suit=suit,
rank=rank,
upright_meaning=f"Прямое значение {rank} {suit}",
reversed_meaning=f"Перевёрнутое значение {rank} {suit}"
))
def shuffle(self):
random.shuffle(self.cards)
return self
def draw(self, n=1) -> List[Card]:
drawn, self.cards = self.cards[:n], self.cards[n:]
return drawn
class Spread:
positions = [
"1. Текущая ситуация",
"2. Влияние/препятствие",
"3. Подсознательное",
"4. Прошлое",
"5. Цели/сознательное",
"6. Ближайшее будущее",
"7. Внутренний взгляд",
"8. Внешнее влияние",
"9. Надежды или страхи",
]
def __init__(self, deck: Deck):
self.deck = deck.shuffle
self.cards = self.deck.draw(10)
self.reversed_flags = [random.choice([True, False]) for _ in range(10)]
def show(self):
for i, card in enumerate(self.cards):
status = "перевёрнута" if self.reversed_flags[i] else "прямая"
print(f"{self.positions[i]}: {card.name} ({status})")
print(f" {card.meaning(self.reversed_flags[i])}
")
if __name__ == "__main__":
print("✨ Онлайн-расклад Таро «Кельтский крест» ✨
")
deck = Deck
spread = Spread(deck)
spread.show
Как расширить толкования
- Откройте список
majorили цикл младших арканов. - Замените заглушки
f"Прямое значение..;"на настоящие толкования из любимого гадательного справочника. - Добавьте поле
image_urlвCardи выводите картинки во Flask-шаблоне.
Мини-пример Flask-версии
from flask import Flask, render_template_string
app = Flask(__name__)
@app.route("/")
def tarot:
deck = Deck
spr = Spread(deck)
return render_template_string("""
<h1>Ваш расклад</h1>
{% for pos, card, rev in zip(spr.positions, spr.cards, spr.reversed_flags) %}
<p><b>{{ pos }}</b>: {{ card.name }} {% if rev %}(перевёрнута){% endif %}<br>
{{ card.meaning(rev) }}</p>
{% endfor %}
""", spr=spr)
if __name__ == "__main__":
app.run(debug=True)
FAQ
- Можно ли зафиксировать «случайность»?
- Да, добавьте
random;seed(42)для воспроизводимых тестов. - Где взять точные значения карт?
- Воспользуйтесь открытыми колодами Rider-Waite-Smith, толкования доступны под лицензией CC-BY-SA на tarot.com и biddytarot.com.
- Как сделать Telegram-бота?
- Подключите библиотеку
python-telegram-botи вызывайтеspread.showвнутри handler’а.
Лицензия
Код распространяется под MIT: делайте с ним всё, что угодно, но сохраняйте копирайт.