pyscript-programming-language 1.9.0__tar.gz → 1.10.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. {pyscript_programming_language-1.9.0/pyscript_programming_language.egg-info → pyscript_programming_language-1.10.1}/PKG-INFO +8 -7
  2. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/README.md +4 -3
  3. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/__init__.py +10 -4
  4. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/__init__.pyi +13 -6
  5. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/__main__.py +72 -10
  6. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/core/analyzer.py +48 -65
  7. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/core/buffer.py +13 -9
  8. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/core/cache.py +13 -4
  9. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/core/checks.py +3 -7
  10. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/core/constants.py +22 -9
  11. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/core/context.py +4 -2
  12. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/core/exceptions.py +16 -17
  13. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/core/handlers.py +9 -18
  14. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/core/highlight.py +117 -87
  15. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/core/interpreter.py +158 -81
  16. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/core/lexer.py +82 -72
  17. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/core/mapping.py +20 -14
  18. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/core/nodes.py +53 -11
  19. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/core/objects.py +70 -52
  20. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/core/parser.py +361 -301
  21. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/core/position.py +5 -9
  22. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/core/pysbuiltins.py +84 -37
  23. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/core/results.py +6 -4
  24. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/core/runner.py +39 -24
  25. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/core/symtab.py +34 -31
  26. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/core/token.py +2 -5
  27. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/core/utils/__init__.py +2 -0
  28. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/core/utils/ansi.py +22 -22
  29. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/core/utils/debug.py +0 -1
  30. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/core/utils/decorators.py +4 -3
  31. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/core/utils/generic.py +13 -14
  32. pyscript_programming_language-1.10.1/pyscript/core/utils/jsdict.py +34 -0
  33. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/core/utils/module.py +2 -1
  34. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/core/utils/shell.py +5 -3
  35. pyscript_programming_language-1.10.1/pyscript/core/utils/similarity.py +22 -0
  36. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/core/utils/string.py +5 -3
  37. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/core/version.py +5 -3
  38. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/lib/ansi.pys +1 -1
  39. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/lib/ast/__init__.pys +3 -3
  40. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/lib/ast/ast_dump.py +22 -2
  41. pyscript_programming_language-1.10.1/pyscript/lib/ast/ast_literal_eval.py +84 -0
  42. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/lib/ast/ast_unparse.py +72 -16
  43. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/lib/ast/ast_walk.py +19 -18
  44. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/lib/brainfuck.pys +69 -76
  45. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/lib/inspect.pys +1 -1
  46. pyscript_programming_language-1.10.1/pyscript/lib/jsdict.pys +5 -0
  47. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/lib/parser.pys +10 -13
  48. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/lib/site.pys +10 -13
  49. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/lib/sys.pys +3 -0
  50. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1/pyscript_programming_language.egg-info}/PKG-INFO +8 -7
  51. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript_programming_language.egg-info/SOURCES.txt +2 -2
  52. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript_programming_language.egg-info/requires.txt +1 -1
  53. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/setup.py +2 -2
  54. pyscript_programming_language-1.9.0/pyscript/core/utils/similarity.py +0 -22
  55. pyscript_programming_language-1.9.0/pyscript/lib/ast/ast_literal_eval.py +0 -51
  56. pyscript_programming_language-1.9.0/pyscript/lib/jsdict.pys +0 -22
  57. pyscript_programming_language-1.9.0/pyscript/site-packages/67.pys +0 -1
  58. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/MANIFEST.in +0 -0
  59. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/core/__init__.py +0 -0
  60. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/core/bases.py +0 -0
  61. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/core/utils/path.py +0 -0
  62. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/lib/__hello__.pys +0 -0
  63. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/lib/dis.pys +0 -0
  64. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/lib/explorer.pys +0 -0
  65. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/lib/fpstimer.pys +0 -0
  66. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/lib/getch.pys +0 -0
  67. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/lib/keyword.pys +0 -0
  68. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/lib/symtable.pys +0 -0
  69. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/lib/token.pys +0 -0
  70. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/lib/tokenize/__init__.pys +0 -0
  71. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/lib/tokenize/tok_untokenize.py +0 -0
  72. {pyscript_programming_language-1.9.0/pyscript/lib → pyscript_programming_language-1.10.1/pyscript/site-packages}/this.pys +0 -0
  73. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript/this.py +0 -0
  74. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript_programming_language.egg-info/dependency_links.txt +0 -0
  75. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/pyscript_programming_language.egg-info/top_level.txt +0 -0
  76. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.1}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyscript-programming-language
3
- Version: 1.9.0
3
+ Version: 1.10.1
4
4
  Summary: PyScript Programming Language
5
5
  Home-page: https://azzammuhyala.github.io/pyscript
6
6
  Author: azzammuhyala
@@ -17,9 +17,9 @@ Classifier: Topic :: Software Development :: Interpreters
17
17
  Classifier: Topic :: Software Development :: Compilers
18
18
  Requires-Python: >=3.10
19
19
  Description-Content-Type: text/markdown
20
- Provides-Extra: extras
21
- Requires-Dist: beartype; extra == "extras"
22
- Requires-Dist: pygments; extra == "extras"
20
+ Provides-Extra: other
21
+ Requires-Dist: beartype; extra == "other"
22
+ Requires-Dist: pygments; extra == "other"
23
23
  Dynamic: author
24
24
  Dynamic: author-email
25
25
  Dynamic: classifier
@@ -35,9 +35,9 @@ Dynamic: summary
35
35
 
36
36
  # PyScript
37
37
 
38
- <p align="center">
38
+ <div align="center">
39
39
  <img src="https://github.com/azzammuhyala/pyscript/blob/main/PyScript.png?raw=true" alt="PyScript Logo" width="200">
40
- </p>
40
+ </div>
41
41
 
42
42
  PyScript is a simple programming language built on top of Python. It combines some syntax from Python and JavaScript,
43
43
  so if you're already familiar with Python or JavaScript, or both, it should be quite easy to learn.
@@ -65,7 +65,7 @@ Next, after downloading and configuring the Python application, you can download
65
65
  [PyScript releases](https://github.com/azzammuhyala/pyscript/releases) or from Python Pip with this command
66
66
  (_Recommended_):
67
67
  ```sh
68
- python -m pip install -U pyscript-programming-language
68
+ pip install -U pyscript-programming-language
69
69
  ```
70
70
 
71
71
  After that, you can run the PyScript shell (_REPL_) with this command:
@@ -78,6 +78,7 @@ If successful, you can see the version, release date, and a `>>>` like Python sh
78
78
  [PyScript extension](https://marketplace.visualstudio.com/items?itemName=azzammuhyala.pyslang) for Syntax Highlight!
79
79
 
80
80
  ## Syntax
81
+ Familiar? There it is!
81
82
  <pre><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4"> = </span><span style="color:#4EC9B0">float</span><span style="color:#FFD705">(</span><span style="color:#DCDCAA">input</span><span style="color:#D45DBA">(</span><span style="color:#CE9178">&quot;Enter a first number : &quot;</span><span style="color:#D45DBA">)</span><span style="color:#FFD705">)</span><br><span style="color:#8CDCFE">b</span><span style="color:#D4D4D4"> = </span><span style="color:#4EC9B0">float</span><span style="color:#FFD705">(</span><span style="color:#DCDCAA">input</span><span style="color:#D45DBA">(</span><span style="color:#CE9178">&quot;Enter a second number: &quot;</span><span style="color:#D45DBA">)</span><span style="color:#FFD705">)</span><br><span style="color:#8CDCFE">op</span><span style="color:#D4D4D4"> = </span><span style="color:#DCDCAA">input</span><span style="color:#FFD705">(</span><span style="color:#CE9178">&quot;Enter an operation (+, -, *, /): &quot;</span><span style="color:#FFD705">)</span><br><br><span style="color:#C586C0">switch</span><span style="color:#D4D4D4"> </span><span style="color:#FFD705">(</span><span style="color:#8CDCFE">op</span><span style="color:#D4D4D4">.</span><span style="color:#DCDCAA">strip</span><span style="color:#D45DBA">()</span><span style="color:#FFD705">)</span><br><span style="color:#FFD705">{</span><br><span style="color:#D4D4D4"> </span><span style="color:#C586C0">case</span><span style="color:#D4D4D4"> </span><span style="color:#CE9178">&#x27;+&#x27;</span><span style="color:#D4D4D4">:</span><br><span style="color:#D4D4D4"> </span><span style="color:#8CDCFE">result</span><span style="color:#D4D4D4"> = </span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4"> + </span><span style="color:#8CDCFE">b</span><br><span style="color:#D4D4D4"> </span><span style="color:#DCDCAA">print</span><span style="color:#D45DBA">(</span><span style="color:#CE9178">&quot;Result of {} + {} = {}&quot;</span><span style="color:#D4D4D4">.</span><span style="color:#DCDCAA">format</span><span style="color:#1A9FFF">(</span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">b</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">result</span><span style="color:#1A9FFF">)</span><span style="color:#D45DBA">)</span><br><span style="color:#D4D4D4"> </span><span style="color:#C586C0">break</span><br><br><span style="color:#D4D4D4"> </span><span style="color:#C586C0">case</span><span style="color:#D4D4D4"> </span><span style="color:#CE9178">&#x27;-&#x27;</span><span style="color:#D4D4D4">:</span><br><span style="color:#D4D4D4"> </span><span style="color:#8CDCFE">result</span><span style="color:#D4D4D4"> = </span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4"> - </span><span style="color:#8CDCFE">b</span><br><span style="color:#D4D4D4"> </span><span style="color:#DCDCAA">print</span><span style="color:#D45DBA">(</span><span style="color:#CE9178">&quot;Result of {} - {} = {}&quot;</span><span style="color:#D4D4D4">.</span><span style="color:#DCDCAA">format</span><span style="color:#1A9FFF">(</span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">b</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">result</span><span style="color:#1A9FFF">)</span><span style="color:#D45DBA">)</span><br><span style="color:#D4D4D4"> </span><span style="color:#C586C0">break</span><br><br><span style="color:#D4D4D4"> </span><span style="color:#C586C0">case</span><span style="color:#D4D4D4"> </span><span style="color:#CE9178">&#x27;*&#x27;</span><span style="color:#D4D4D4">:</span><br><span style="color:#D4D4D4"> </span><span style="color:#8CDCFE">result</span><span style="color:#D4D4D4"> = </span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4"> * </span><span style="color:#8CDCFE">b</span><br><span style="color:#D4D4D4"> </span><span style="color:#DCDCAA">print</span><span style="color:#D45DBA">(</span><span style="color:#CE9178">&quot;Result of {} * {} = {}&quot;</span><span style="color:#D4D4D4">.</span><span style="color:#DCDCAA">format</span><span style="color:#1A9FFF">(</span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">b</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">result</span><span style="color:#1A9FFF">)</span><span style="color:#D45DBA">)</span><br><span style="color:#D4D4D4"> </span><span style="color:#C586C0">break</span><br><br><span style="color:#D4D4D4"> </span><span style="color:#C586C0">case</span><span style="color:#D4D4D4"> </span><span style="color:#CE9178">&#x27;/&#x27;</span><span style="color:#D4D4D4">:</span><br><span style="color:#D4D4D4"> </span><span style="color:#8CDCFE">result</span><span style="color:#D4D4D4"> = </span><span style="color:#8CDCFE">b</span><span style="color:#D4D4D4"> != </span><span style="color:#B5CEA8">0</span><span style="color:#D4D4D4"> ? </span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4"> / </span><span style="color:#8CDCFE">b</span><span style="color:#D4D4D4"> : </span><span style="color:#CE9178">&quot;Cannot be divided by 0!&quot;</span><br><span style="color:#D4D4D4"> </span><span style="color:#DCDCAA">print</span><span style="color:#D45DBA">(</span><span style="color:#CE9178">&quot;Result of {} / {} = {}&quot;</span><span style="color:#D4D4D4">.</span><span style="color:#DCDCAA">format</span><span style="color:#1A9FFF">(</span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">b</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">result</span><span style="color:#1A9FFF">)</span><span style="color:#D45DBA">)</span><br><span style="color:#D4D4D4"> </span><span style="color:#C586C0">break</span><br><br><span style="color:#D4D4D4"> </span><span style="color:#C586C0">default</span><span style="color:#D4D4D4">:</span><br><span style="color:#D4D4D4"> </span><span style="color:#DCDCAA">print</span><span style="color:#D45DBA">(</span><span style="color:#CE9178">&quot;Unknown operation&quot;</span><span style="color:#D45DBA">)</span><br><span style="color:#FFD705">}</span></pre>
82
83
 
83
84
  ## Behind it
@@ -1,8 +1,8 @@
1
1
  # PyScript
2
2
 
3
- <p align="center">
3
+ <div align="center">
4
4
  <img src="https://github.com/azzammuhyala/pyscript/blob/main/PyScript.png?raw=true" alt="PyScript Logo" width="200">
5
- </p>
5
+ </div>
6
6
 
7
7
  PyScript is a simple programming language built on top of Python. It combines some syntax from Python and JavaScript,
8
8
  so if you're already familiar with Python or JavaScript, or both, it should be quite easy to learn.
@@ -30,7 +30,7 @@ Next, after downloading and configuring the Python application, you can download
30
30
  [PyScript releases](https://github.com/azzammuhyala/pyscript/releases) or from Python Pip with this command
31
31
  (_Recommended_):
32
32
  ```sh
33
- python -m pip install -U pyscript-programming-language
33
+ pip install -U pyscript-programming-language
34
34
  ```
35
35
 
36
36
  After that, you can run the PyScript shell (_REPL_) with this command:
@@ -43,6 +43,7 @@ If successful, you can see the version, release date, and a `>>>` like Python sh
43
43
  [PyScript extension](https://marketplace.visualstudio.com/items?itemName=azzammuhyala.pyslang) for Syntax Highlight!
44
44
 
45
45
  ## Syntax
46
+ Familiar? There it is!
46
47
  <pre><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4"> = </span><span style="color:#4EC9B0">float</span><span style="color:#FFD705">(</span><span style="color:#DCDCAA">input</span><span style="color:#D45DBA">(</span><span style="color:#CE9178">&quot;Enter a first number : &quot;</span><span style="color:#D45DBA">)</span><span style="color:#FFD705">)</span><br><span style="color:#8CDCFE">b</span><span style="color:#D4D4D4"> = </span><span style="color:#4EC9B0">float</span><span style="color:#FFD705">(</span><span style="color:#DCDCAA">input</span><span style="color:#D45DBA">(</span><span style="color:#CE9178">&quot;Enter a second number: &quot;</span><span style="color:#D45DBA">)</span><span style="color:#FFD705">)</span><br><span style="color:#8CDCFE">op</span><span style="color:#D4D4D4"> = </span><span style="color:#DCDCAA">input</span><span style="color:#FFD705">(</span><span style="color:#CE9178">&quot;Enter an operation (+, -, *, /): &quot;</span><span style="color:#FFD705">)</span><br><br><span style="color:#C586C0">switch</span><span style="color:#D4D4D4"> </span><span style="color:#FFD705">(</span><span style="color:#8CDCFE">op</span><span style="color:#D4D4D4">.</span><span style="color:#DCDCAA">strip</span><span style="color:#D45DBA">()</span><span style="color:#FFD705">)</span><br><span style="color:#FFD705">{</span><br><span style="color:#D4D4D4"> </span><span style="color:#C586C0">case</span><span style="color:#D4D4D4"> </span><span style="color:#CE9178">&#x27;+&#x27;</span><span style="color:#D4D4D4">:</span><br><span style="color:#D4D4D4"> </span><span style="color:#8CDCFE">result</span><span style="color:#D4D4D4"> = </span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4"> + </span><span style="color:#8CDCFE">b</span><br><span style="color:#D4D4D4"> </span><span style="color:#DCDCAA">print</span><span style="color:#D45DBA">(</span><span style="color:#CE9178">&quot;Result of {} + {} = {}&quot;</span><span style="color:#D4D4D4">.</span><span style="color:#DCDCAA">format</span><span style="color:#1A9FFF">(</span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">b</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">result</span><span style="color:#1A9FFF">)</span><span style="color:#D45DBA">)</span><br><span style="color:#D4D4D4"> </span><span style="color:#C586C0">break</span><br><br><span style="color:#D4D4D4"> </span><span style="color:#C586C0">case</span><span style="color:#D4D4D4"> </span><span style="color:#CE9178">&#x27;-&#x27;</span><span style="color:#D4D4D4">:</span><br><span style="color:#D4D4D4"> </span><span style="color:#8CDCFE">result</span><span style="color:#D4D4D4"> = </span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4"> - </span><span style="color:#8CDCFE">b</span><br><span style="color:#D4D4D4"> </span><span style="color:#DCDCAA">print</span><span style="color:#D45DBA">(</span><span style="color:#CE9178">&quot;Result of {} - {} = {}&quot;</span><span style="color:#D4D4D4">.</span><span style="color:#DCDCAA">format</span><span style="color:#1A9FFF">(</span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">b</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">result</span><span style="color:#1A9FFF">)</span><span style="color:#D45DBA">)</span><br><span style="color:#D4D4D4"> </span><span style="color:#C586C0">break</span><br><br><span style="color:#D4D4D4"> </span><span style="color:#C586C0">case</span><span style="color:#D4D4D4"> </span><span style="color:#CE9178">&#x27;*&#x27;</span><span style="color:#D4D4D4">:</span><br><span style="color:#D4D4D4"> </span><span style="color:#8CDCFE">result</span><span style="color:#D4D4D4"> = </span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4"> * </span><span style="color:#8CDCFE">b</span><br><span style="color:#D4D4D4"> </span><span style="color:#DCDCAA">print</span><span style="color:#D45DBA">(</span><span style="color:#CE9178">&quot;Result of {} * {} = {}&quot;</span><span style="color:#D4D4D4">.</span><span style="color:#DCDCAA">format</span><span style="color:#1A9FFF">(</span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">b</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">result</span><span style="color:#1A9FFF">)</span><span style="color:#D45DBA">)</span><br><span style="color:#D4D4D4"> </span><span style="color:#C586C0">break</span><br><br><span style="color:#D4D4D4"> </span><span style="color:#C586C0">case</span><span style="color:#D4D4D4"> </span><span style="color:#CE9178">&#x27;/&#x27;</span><span style="color:#D4D4D4">:</span><br><span style="color:#D4D4D4"> </span><span style="color:#8CDCFE">result</span><span style="color:#D4D4D4"> = </span><span style="color:#8CDCFE">b</span><span style="color:#D4D4D4"> != </span><span style="color:#B5CEA8">0</span><span style="color:#D4D4D4"> ? </span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4"> / </span><span style="color:#8CDCFE">b</span><span style="color:#D4D4D4"> : </span><span style="color:#CE9178">&quot;Cannot be divided by 0!&quot;</span><br><span style="color:#D4D4D4"> </span><span style="color:#DCDCAA">print</span><span style="color:#D45DBA">(</span><span style="color:#CE9178">&quot;Result of {} / {} = {}&quot;</span><span style="color:#D4D4D4">.</span><span style="color:#DCDCAA">format</span><span style="color:#1A9FFF">(</span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">b</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">result</span><span style="color:#1A9FFF">)</span><span style="color:#D45DBA">)</span><br><span style="color:#D4D4D4"> </span><span style="color:#C586C0">break</span><br><br><span style="color:#D4D4D4"> </span><span style="color:#C586C0">default</span><span style="color:#D4D4D4">:</span><br><span style="color:#D4D4D4"> </span><span style="color:#DCDCAA">print</span><span style="color:#D45DBA">(</span><span style="color:#CE9178">&quot;Unknown operation&quot;</span><span style="color:#D45DBA">)</span><br><span style="color:#FFD705">}</span></pre>
47
48
 
48
49
  ## Behind it
@@ -8,21 +8,26 @@ if __import__('sys').version_info < (3, 10):
8
8
 
9
9
  from . import core
10
10
 
11
- from .core.constants import DEFAULT, DEBUG, SILENT, RETURN_RESULT, HIGHLIGHT, NO_COLOR, REVERSE_POW_XOR
11
+ from .core.constants import (
12
+ DEFAULT, NO_COLOR, DEBUG, SILENT, RETURN_RESULT, DONT_SHOW_BANNER_ON_SHELL, HIGHLIGHT, DICT_TO_JSDICT
13
+ )
12
14
  from .core.cache import undefined, hook
13
- from .core.highlight import HLFMT_HTML, HLFMT_ANSI, HLFMT_BBCODE, pys_highlight, PygmentsPyScriptLexer
15
+ from .core.highlight import (
16
+ HLFMT_HTML, HLFMT_ANSI, HLFMT_BBCODE, pys_highlight, PygmentsPyScriptStyle, PygmentsPyScriptLexer
17
+ )
14
18
  from .core.runner import pys_exec, pys_eval, pys_require, pys_shell
15
19
  from .core.version import version, version_info, __version__, __date__
16
20
 
17
21
  __all__ = (
18
22
  'core',
19
23
  'DEFAULT',
24
+ 'NO_COLOR',
20
25
  'DEBUG',
21
26
  'SILENT',
22
27
  'RETURN_RESULT',
28
+ 'DONT_SHOW_BANNER_ON_SHELL',
23
29
  'HIGHLIGHT',
24
- 'NO_COLOR',
25
- 'REVERSE_POW_XOR',
30
+ 'DICT_TO_JSDICT',
26
31
  'HLFMT_HTML',
27
32
  'HLFMT_ANSI',
28
33
  'HLFMT_BBCODE',
@@ -35,5 +40,6 @@ __all__ = (
35
40
  'pys_eval',
36
41
  'pys_require',
37
42
  'pys_shell',
43
+ 'PygmentsPyScriptStyle',
38
44
  'PygmentsPyScriptLexer'
39
45
  )
@@ -13,15 +13,19 @@ if TYPE_CHECKING:
13
13
  from types import BuiltinMethodType, ModuleType
14
14
 
15
15
  from . import core as core
16
- from .core.highlight import PygmentsPyScriptLexer as PygmentsPyScriptLexer
16
+ from .core.highlight import (
17
+ PygmentsPyScriptStyle as PygmentsPyScriptStyle,
18
+ PygmentsPyScriptLexer as PygmentsPyScriptLexer
19
+ )
17
20
 
18
21
  DEFAULT: int
22
+ NO_COLOR: int
19
23
  DEBUG: int
20
24
  SILENT: int
21
25
  RETURN_RESULT: int
26
+ DONT_SHOW_BANNER_ON_SHELL: int
22
27
  HIGHLIGHT: int
23
- NO_COLOR: int
24
- REVERSE_POW_XOR: int
28
+ DICT_TO_JSDICT: int
25
29
 
26
30
  HLFMT_HTML: _PysHighlightFormatter
27
31
  HLFMT_ANSI: _PysHighlightFormatter
@@ -53,13 +57,15 @@ def pys_highlight(
53
57
  def pys_exec(
54
58
  source: str | bytes | bytearray | Iterable | BuiltinMethodType | IOBase | PysFileBuffer,
55
59
  globals: Optional[dict[str, Any] | PysSymbolTable | PysUndefined] = None,
56
- flags: int = DEFAULT
60
+ flags: int = DEFAULT,
61
+ parser_flags: int = DEFAULT
57
62
  ) -> None | PysExecuteResult: ...
58
63
 
59
64
  def pys_eval(
60
65
  source: str | bytes | bytearray | Iterable | BuiltinMethodType | IOBase | PysFileBuffer,
61
66
  globals: Optional[dict[str, Any] | PysSymbolTable | PysUndefined] = None,
62
- flags: int = DEFAULT
67
+ flags: int = DEFAULT,
68
+ parser_flags: int = DEFAULT
63
69
  ) -> Any | PysExecuteResult: ...
64
70
 
65
71
  def pys_require(
@@ -69,7 +75,8 @@ def pys_require(
69
75
 
70
76
  def pys_shell(
71
77
  globals: Optional[dict[str, Any] | PysSymbolTable | PysUndefined] = None,
72
- flags: int = DEFAULT
78
+ flags: int = DEFAULT,
79
+ parser_flags: int = DEFAULT
73
80
  ) -> int | Any: ...
74
81
 
75
82
  __version__: str
@@ -1,17 +1,49 @@
1
1
  from .core.buffer import PysFileBuffer
2
- from .core.cache import path, undefined
3
- from .core.constants import DEFAULT, DEBUG, NO_COLOR
4
- from .core.highlight import HLFMT_HTML, HLFMT_ANSI, HLFMT_BBCODE, pys_highlight
2
+ from .core.cache import path, undefined, hook
3
+ from .core.constants import DEFAULT, DEBUG, DONT_SHOW_BANNER_ON_SHELL, NO_COLOR
4
+ from .core.highlight import (
5
+ HLFMT_HTML, HLFMT_ANSI, HLFMT_BBCODE, pys_highlight, PygmentsPyScriptStyle, PygmentsPyScriptLexer
6
+ )
5
7
  from .core.runner import _normalize_globals, pys_runner, pys_shell
6
8
  from .core.utils.module import get_module_name_from_path
7
9
  from .core.utils.path import normpath
8
10
  from .core.version import __version__
9
11
 
12
+ try:
13
+ from pygments import highlight
14
+ from pygments.formatters import TerminalFormatter, TerminalTrueColorFormatter, Terminal256Formatter
15
+
16
+ FORMAT_PYGMENTS_MAP = {
17
+ 'pm-terminal': TerminalFormatter,
18
+ 'pm-true-terminal': TerminalTrueColorFormatter,
19
+ 'pm-256-terminal': Terminal256Formatter
20
+ }
21
+
22
+ PYGMENTS = True
23
+ except ImportError:
24
+ PYGMENTS = False
25
+
10
26
  from argparse import ArgumentParser
11
27
  from os import environ
12
28
 
13
29
  import sys
14
30
 
31
+ def split_argv():
32
+ need_value_arguments = {'-c', '--command', '-l', '--highlight', '-r', '--py-recursion'}
33
+ argv = sys.argv
34
+ i = 1
35
+
36
+ while i < len(argv):
37
+ argument = argv[i]
38
+ if argument in need_value_arguments:
39
+ i += 1
40
+ elif not argument.startswith('-'):
41
+ break
42
+ i += 1
43
+
44
+ hook.argv = argv[i:]
45
+ return argv[1:i + 1]
46
+
15
47
  FORMAT_HIGHLIGHT_MAP = {
16
48
  'html': HLFMT_HTML,
17
49
  'ansi': HLFMT_ANSI,
@@ -58,7 +90,7 @@ parser.add_argument(
58
90
 
59
91
  parser.add_argument(
60
92
  '-l', '--highlight',
61
- choices=tuple(FORMAT_HIGHLIGHT_MAP.keys()),
93
+ choices=tuple(FORMAT_HIGHLIGHT_MAP.keys()) + tuple(FORMAT_PYGMENTS_MAP.keys() if PYGMENTS else ()),
62
94
  default=None,
63
95
  help="Generate highlight code from a 'file'"
64
96
  )
@@ -76,11 +108,17 @@ parser.add_argument(
76
108
  help="Set a Python recursion limit"
77
109
  )
78
110
 
111
+ parser.add_argument(
112
+ '-q',
113
+ action='store_true',
114
+ help="Don't print version and copyright messages on interactive startup"
115
+ )
116
+
79
117
  def argument_error(argument, message):
80
118
  parser.print_usage(sys.stderr)
81
119
  parser.exit(2, f"{parser.prog}: error: argument {argument}: {message}\n")
82
120
 
83
- args = parser.parse_args()
121
+ args = parser.parse_args(split_argv())
84
122
 
85
123
  if args.highlight and args.file is None:
86
124
  argument_error("-l/--highlight", "argument 'file' required")
@@ -98,6 +136,8 @@ if args.debug:
98
136
  flags |= DEBUG
99
137
  if args.no_color or environ.get('NO_COLOR') is not None:
100
138
  flags |= NO_COLOR
139
+ if args.q:
140
+ flags |= DONT_SHOW_BANNER_ON_SHELL
101
141
 
102
142
  if args.file is not None:
103
143
  path = normpath(args.file)
@@ -122,7 +162,22 @@ if args.file is not None:
122
162
 
123
163
  if args.highlight:
124
164
  try:
125
- print(pys_highlight(file, FORMAT_HIGHLIGHT_MAP.get(args.highlight)))
165
+ if args.highlight in FORMAT_HIGHLIGHT_MAP:
166
+ print(
167
+ pys_highlight(
168
+ source=file,
169
+ format=FORMAT_HIGHLIGHT_MAP[args.highlight]
170
+ )
171
+ )
172
+ else:
173
+ print(
174
+ flush=True,
175
+ end=highlight(
176
+ code=file.text,
177
+ lexer=PygmentsPyScriptLexer(),
178
+ formatter=FORMAT_PYGMENTS_MAP[args.highlight](style=PygmentsPyScriptStyle)
179
+ )
180
+ )
126
181
  except BaseException as e:
127
182
  parser.error(f"file {path!r}: Highlight error: {e}")
128
183
 
@@ -135,9 +190,13 @@ if args.file is not None:
135
190
  )
136
191
 
137
192
  if args.inspect:
138
- code = pys_shell(result.context.symbol_table, result.context.flags)
193
+ code = pys_shell(
194
+ globals=result.context.symbol_table,
195
+ flags=result.context.flags,
196
+ parser_flags=result.parser_flags
197
+ )
139
198
  else:
140
- code = result.process()[0]
199
+ code = result.end_process()[0]
141
200
 
142
201
  elif args.command is not None:
143
202
  file = PysFileBuffer(args.command)
@@ -146,9 +205,12 @@ elif args.command is not None:
146
205
  mode='exec',
147
206
  symbol_table=_normalize_globals(file, undefined),
148
207
  flags=flags
149
- ).process()[0]
208
+ ).end_process()[0]
150
209
 
151
210
  else:
152
- code = pys_shell(undefined, flags)
211
+ code = pys_shell(
212
+ globals=undefined,
213
+ flags=flags
214
+ )
153
215
 
154
216
  sys.exit(code)
@@ -1,5 +1,5 @@
1
1
  from .bases import Pys
2
- from .checks import is_unpack_assignment, is_incremental
2
+ from .checks import is_unpack_assignment
3
3
  from .constants import TOKENS, KEYWORDS, DEFAULT
4
4
  from .context import PysContext
5
5
  from .exceptions import PysTraceback
@@ -22,22 +22,9 @@ class PysAnalyzer(Pys):
22
22
 
23
23
  self.node = node
24
24
  self.flags = flags
25
- self.context = context_parent
25
+ self.context_parent = context_parent
26
26
  self.context_parent_entry_position = context_parent_entry_position
27
27
 
28
- def throw(self, message, position):
29
- if self.error is None:
30
- self.error = PysTraceback(
31
- SyntaxError(message),
32
- PysContext(
33
- file=self.node.position.file,
34
- flags=self.flags,
35
- parent=self.context,
36
- parent_entry_position=self.context_parent_entry_position
37
- ),
38
- position
39
- )
40
-
41
28
  @typechecked
42
29
  def analyze(self) -> PysTraceback | None:
43
30
  self.in_loop = 0
@@ -50,6 +37,19 @@ class PysAnalyzer(Pys):
50
37
  self.visit(self.node)
51
38
  return self.error
52
39
 
40
+ def throw(self, message, position):
41
+ if self.error is None:
42
+ self.error = PysTraceback(
43
+ SyntaxError(message),
44
+ PysContext(
45
+ file=self.node.position.file,
46
+ flags=self.flags,
47
+ parent=self.context_parent,
48
+ parent_entry_position=self.context_parent_entry_position
49
+ ),
50
+ position
51
+ )
52
+
53
53
  def visit(self, node):
54
54
  func = getattr(self, 'visit_' + type(node).__name__.removeprefix('Pys'), None)
55
55
  if not self.error and func:
@@ -106,11 +106,9 @@ class PysAnalyzer(Pys):
106
106
  if isinstance(element, tuple):
107
107
  token, value = element
108
108
  name = token.value
109
-
110
109
  if name in keyword_names:
111
110
  self.throw(f"duplicate argument {name!r} in call definition", token.position)
112
111
  return
113
-
114
112
  keyword_names.add(name)
115
113
 
116
114
  else:
@@ -136,6 +134,8 @@ class PysAnalyzer(Pys):
136
134
  if self.error:
137
135
  return
138
136
 
137
+ self.visit(node.invalid)
138
+
139
139
  elif node.style == 'pythonic':
140
140
  self.visit(node.valid)
141
141
  if self.error:
@@ -145,10 +145,7 @@ class PysAnalyzer(Pys):
145
145
  if self.error:
146
146
  return
147
147
 
148
- else:
149
- raise ValueError(f"unknown ternary operator style {node.style!r}")
150
-
151
- self.visit(node.invalid)
148
+ self.visit(node.invalid)
152
149
 
153
150
  def visit_BinaryOperatorNode(self, node):
154
151
  self.visit(node.left)
@@ -158,25 +155,11 @@ class PysAnalyzer(Pys):
158
155
  self.visit(node.right)
159
156
 
160
157
  def visit_UnaryOperatorNode(self, node):
161
- value = node.value
162
-
163
- if is_incremental(node.operand.type):
164
- type = value.__class__
165
- operator = 'increase' if node.operand.type == TOKENS['DOUBLE-PLUS'] else 'decrease'
166
-
167
- if type is PysKeywordNode:
168
- self.throw(f"cannot {operator} {value.name.value}", value.position)
169
- return
170
-
171
- elif isinstance(value, PysNode):
172
- if type not in (PysIdentifierNode, PysAttributeNode, PysSubscriptNode):
173
- self.throw(f"cannot {operator} literal", value.position)
174
- return
175
-
176
- else:
177
- raise TypeError("UnaryOperator: node.value is not PysNode")
158
+ self.visit(node.value)
178
159
 
179
- self.visit(value)
160
+ def visit_IncrementalNode(self, node):
161
+ operator = 'increase' if node.operand.type == TOKENS['DOUBLE-PLUS'] else 'decrease'
162
+ self.visit_declaration_AssignNode(node.target, f"cannot {operator} literal", operator)
180
163
 
181
164
  def visit_StatementsNode(self, node):
182
165
  for element in node.body:
@@ -185,11 +168,8 @@ class PysAnalyzer(Pys):
185
168
  return
186
169
 
187
170
  def visit_AssignNode(self, node):
188
- self.visit_declaration_AssignNode(
189
- node.target,
190
- "cannot assign to expression here. Maybe you meant '==' instead of '='?"
191
- )
192
-
171
+ self.visit_declaration_AssignNode(node.target,
172
+ "cannot assign to expression here. Maybe you meant '==' instead of '='?")
193
173
  if self.error:
194
174
  return
195
175
 
@@ -248,8 +228,6 @@ class PysAnalyzer(Pys):
248
228
 
249
229
  if node.default:
250
230
  self.visit(node.default)
251
- if self.error:
252
- return
253
231
 
254
232
  def visit_TryNode(self, node):
255
233
  self.visit(node.body)
@@ -295,9 +273,6 @@ class PysAnalyzer(Pys):
295
273
  if self.error:
296
274
  return
297
275
 
298
- else:
299
- raise ValueError(f"unknown header struct {node.header}")
300
-
301
276
  self.in_loop += 1
302
277
 
303
278
  self.visit(node.body)
@@ -341,6 +316,22 @@ class PysAnalyzer(Pys):
341
316
  if node.else_body:
342
317
  self.visit(node.else_body)
343
318
 
319
+ def visit_RepeatNode(self, node):
320
+ self.in_loop += 1
321
+
322
+ self.visit(node.body)
323
+ if self.error:
324
+ return
325
+
326
+ self.in_loop -= 1
327
+
328
+ self.visit(node.condition)
329
+ if self.error:
330
+ return
331
+
332
+ if node.else_body:
333
+ self.visit(node.else_body)
334
+
344
335
  def visit_ClassNode(self, node):
345
336
  for decorator in node.decorators:
346
337
  self.visit(decorator)
@@ -471,13 +462,9 @@ class PysAnalyzer(Pys):
471
462
  self.throw(f"cannot {KEYWORDS['delete']} {target.name.value}", target.position)
472
463
  return
473
464
 
474
- elif isinstance(target, PysNode):
475
- if type is not PysIdentifierNode:
476
- self.throw(f"cannot {KEYWORDS['delete']} literal", target.position)
477
- return
478
-
479
- else:
480
- raise TypeError("DeleteNode: node.targets, target is not PysNode")
465
+ elif type is not PysIdentifierNode:
466
+ self.throw(f"cannot {KEYWORDS['delete']} literal", target.position)
467
+ return
481
468
 
482
469
  def visit_ContinueNode(self, node):
483
470
  if self.in_loop == 0:
@@ -515,7 +502,7 @@ class PysAnalyzer(Pys):
515
502
  else:
516
503
  self.visit(nslice)
517
504
 
518
- def visit_declaration_AssignNode(self, node, message):
505
+ def visit_declaration_AssignNode(self, node, message, operator_name='assign'):
519
506
  type = node.__class__
520
507
 
521
508
  if type is PysAttributeNode:
@@ -530,16 +517,12 @@ class PysAnalyzer(Pys):
530
517
 
531
518
  elif is_unpack_assignment(type):
532
519
  for element in node.elements:
533
- self.visit_declaration_AssignNode(element, message)
520
+ self.visit_declaration_AssignNode(element, message, operator_name)
534
521
  if self.error:
535
522
  return
536
523
 
537
524
  elif type is PysKeywordNode:
538
- self.throw(f"cannot assign to {node.name.value}", node.position)
539
-
540
- elif isinstance(node, PysNode):
541
- if type is not PysIdentifierNode:
542
- self.throw(message, node.position)
525
+ self.throw(f"cannot {operator_name} to {node.name.value}", node.position)
543
526
 
544
- else:
545
- raise TypeError("declaration AssignNode: node is not PysNode")
527
+ elif type is not PysIdentifierNode:
528
+ self.throw(message, node.position)
@@ -4,7 +4,8 @@ from .utils.generic import setimuattr
4
4
  from .utils.string import normstr
5
5
 
6
6
  from io import IOBase
7
- from typing import Callable, Iterable, Optional
7
+ from types import BuiltinMethodType
8
+ from typing import Iterable, Optional
8
9
 
9
10
  @immutable
10
11
  class PysBuffer(Pys):
@@ -14,15 +15,14 @@ class PysFileBuffer(PysBuffer):
14
15
 
15
16
  __slots__ = ('text', 'name')
16
17
 
17
- def __init__(
18
- self,
19
- text: str | bytes | bytearray | Iterable | Callable | IOBase | 'PysFileBuffer',
18
+ def __new__(
19
+ cls,
20
+ text: str | bytes | bytearray | Iterable | BuiltinMethodType | IOBase | 'PysFileBuffer',
20
21
  name: Optional[str | bytes] = None
21
- ) -> None:
22
+ ) -> 'PysFileBuffer':
22
23
 
23
24
  if isinstance(text, PysFileBuffer):
24
- name = normstr(text.name if name is None else name)
25
- text = normstr(text.text)
25
+ return text
26
26
 
27
27
  elif isinstance(text, IOBase):
28
28
  name = normstr(getattr(text, 'name', '<io>') if name is None else name)
@@ -32,8 +32,12 @@ class PysFileBuffer(PysBuffer):
32
32
  name = '<string>' if name is None else normstr(name)
33
33
  text = normstr(text)
34
34
 
35
- setimuattr(self, 'text', text)
36
- setimuattr(self, 'name', name)
35
+ instance = super().__new__(cls)
36
+
37
+ setimuattr(instance, 'text', text)
38
+ setimuattr(instance, 'name', name)
39
+
40
+ return instance
37
41
 
38
42
  def __repr__(self) -> str:
39
43
  return f'<FileBuffer from {self.name!r}>'
@@ -4,14 +4,12 @@ from .exceptions import PysTraceback
4
4
  from .utils.debug import print_display, print_traceback
5
5
  from .utils.decorators import inheritable, singleton
6
6
 
7
- from threading import RLock
8
7
  from typing import Any, Callable, Literal
9
8
 
10
9
  loading_modules = set()
11
- lock = RLock()
12
- modules = dict()
10
+ modules = {}
13
11
  path = [SITE_PACKAGES_PATH, LIBRARIES_PATH]
14
- singletons = dict()
12
+ singletons = {}
15
13
 
16
14
  @singleton
17
15
  @inheritable
@@ -39,6 +37,7 @@ class PysHook(Pys):
39
37
  def __new_singleton__(cls) -> 'PysHook':
40
38
  global hook
41
39
  hook = super(cls, cls).__new__(cls)
40
+ hook.argv = []
42
41
  hook.running_shell = False
43
42
  hook.running_breakpoint = False
44
43
  hook.display = print_display
@@ -50,6 +49,16 @@ class PysHook(Pys):
50
49
  def __repr__(self) -> str:
51
50
  return f'<hook object at {id(self):016X}>'
52
51
 
52
+ @property
53
+ def argv(self) -> list[str]:
54
+ return singletons['hook.argv']
55
+
56
+ @argv.setter
57
+ def argv(self, value: list[str]) -> None:
58
+ if not isinstance(value, list) or not all(isinstance(arg, str) for arg in value):
59
+ raise TypeError("hook.argv: argv must be list of strings")
60
+ singletons['hook.argv'] = value
61
+
53
62
  @property
54
63
  def running_shell(self) -> bool:
55
64
  return singletons['hook.running_shell']