File: tips.py

package info (click to toggle)
ipython 9.8.0-1
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 8,624 kB
  • sloc: python: 45,268; sh: 317; makefile: 168
file content (118 lines) | stat: -rw-r--r-- 6,200 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
from datetime import datetime
import os
from random import choice
from typing import Any

_tips: Any = {
    # (month, day)
    "every_year": {
        (1, 1): "Happy new year!",
        # European time:
        # [2/8/25, 23:28:24] Fernando Perez: Hi! Yes, this was my first public
        # announcement:
        # [2/8/25, 23:28:25] Fernando Perez:
        # https://mail.python.org/pipermail/python-list/2001-December/093408.html
        # [2/8/25, 23:28:55] Fernando Perez: All that started two months earlier
        # - in October 2001 I read this article:
        # [2/8/25, 23:28:55] Fernando Perez:
        # https://web.archive.org/web/20011202000624/http://www.onlamp.com/pub/a/python/2001/10/11/pythonnews.html
        # [2/8/25, 23:29:05] Fernando Perez: Which is also archived here:
        # [2/8/25, 23:29:05] Fernando Perez:
        # https://docstore.mik.ua/orelly/weblinux2/orn/interactive_python.html
        # [2/8/25, 23:29:48] Fernando Perez: That article put me on the trail of
        # LazyPython, and I also found out (can’t remember where) about IPP
        # (Interactive Python Prompt), another similar projecd by Janko Hauser.
        # [2/8/25, 23:30:20] Fernando Perez: A also read an article around that
        # time, about new features in Python 2.0, which spoke of how
        # sys.displayhook could be programmed to call any object you wanted.
        # [2/8/25, 23:31:01] Fernando Perez: Those things together gave me the
        # idea of implementing a stateful object, the “IPython Prompt”, that
        # could store a  cache of old results, Mathematica-style, and that could
        # have all kinds of other useful tricks up its sleeve.
        # [2/8/25, 23:31:17] Fernando Perez: I can’t remember if I did the
        # prompt stuff first and then read about LazyPython/IPP.
        # [2/8/25, 23:31:41] Fernando Perez: I do know that, implementation
        # wise, at first I just did the tiny IPython 0.0.1 that I posted much
        # later on github as a gist:
        # [2/8/25, 23:31:55] Fernando Perez:
        # https://gist.github.com/fperez/1579699
        # [2/8/25, 23:32:03] Fernando Perez: But I only shared that publicly
        # much later.
        # [2/8/25, 23:33:19] Fernando Perez: I did find out about IPP/LazyPython
        # sometime in October, contacted Janko and Nathan who told me to use
        # their code at will but said they were busy with other things, and got
        # cranking for a few mad weeks on what became the IPython 0.2.0 that I
        # posted about in that comp.lang.python thread of December 2001.
        # [2/8/25, 23:33:52] Fernando Perez: That period from Oct 11 to Dec 9
        # 2001 was maniacal coding, with very little sleep 🙂
        (
            10,
            11,
        ): "IPython's first line of code was written {} years ago by Fernando Pérez".format(
            datetime.now().year - 2001
        ),
        (
            12,
            9,
        ): "IPython 0.0.2 was announced {} years ago: https://mail.python.org/pipermail/python-list/2001-December/093408.html".format(
            datetime.now().year - 2001
        ),
        (
            3,
            8,
        ): "Today is International Women's Day: https://www.internationalwomensday.com/",
        (
            3,
            31,
        ): "Happy International Transgender Day of Visibility! You are valid. You matter. https://en.wikipedia.org/wiki/International_Transgender_Day_of_Visibility",
    },
    "random": [
        "Use `F2` or %edit with no arguments to open an empty editor with a temporary file.",
        "Run your doctests from within IPython for development and debugging. The special %doctest_mode command toggles a mode where the prompt, output and exceptions display matches as closely as possible that of the default Python interpreter.",
        "You can use `files = !ls *.png`",
        "Use the IPython.lib.demo.Demo class to load any Python script as an interactive demo.",
        "Put a ';' at the end of a line to suppress the printing of output.",
        "You can use Ctrl-O to force a new line in terminal IPython",
        "Use `object?` to see the help on `object`, `object??` to view its source",
        "`?` alone on a line will brings up IPython's help",
        "You can use `%hist` to view history, see the options with `%history?`",
        "You can change the editing mode of IPython to behave more like vi, or emacs.",
        "IPython 9.0+ has hooks to integrate AI/LLM completions.",
        "Use `%timeit` or `%%timeit`, and the  `-r`, `-n`, and `-o` options to easily profile your code.",
        "Use `ipython --help-all | less` to view all the IPython configuration options.",
        "Use `--theme`, or the `%colors` magic to change IPython's themes and colors.",
        "The `%timeit` magic has a `-o` flag, which returns the results, making it easy to plot. See `%timeit?`.",
    ],
}

if os.name == "nt":
    _tips["random"].extend(
        [
            "We can't show you all tips on Windows as sometimes Unicode characters crash the Windows console, please help us debug it."
        ]
    )
    # unicode may crash windows console, so we filter out tips with non-ASCII characters.
    _tips["every_year"] = {
        k: v
        for k, v in _tips["every_year"].items()
        if all(ord(char) < 128 for char in v)
    }
else:
    _tips["random"].extend(
        [
            "You can use LaTeX or Unicode completion, `\\alpha<tab>` will insert the α symbol.",
            "You can find how to type a LaTeX symbol by back-completing it, eg `\\θ<tab>` will expand to `\\theta`.",
            "You can find how to type a Unicode symbol by back-completing it, eg `\\Ⅷ<tab>` will expand to `\\ROMAN NUMERAL EIGHT`.",
            "IPython supports combining unicode identifiers, eg F\\vec<tab> will become F⃗, useful for physics equations. Play with \\dot \\ddot and others.",
        ]
    )


def pick_tip() -> str:
    current_date = datetime.now()
    month, day = current_date.month, current_date.day

    if (month, day) in _tips["every_year"]:
        return _tips["every_year"][(month, day)]

    return choice(_tips["random"])