Repository files navigation

Write Your Python Program

A user-friendly python programming environment for beginners.

The ideas of this environment are based on the great ideas from Schreib dein Programm!.

Quick start

  • Step 1. Install Python 3.12.x or Python 3.13.x or Python 3.14.x.
  • Step 2. Install Visual Studio Code, at least version Version: 1.94.2
  • Step 3. Install the write-your-python-program extension for Visual Studio Code.
  • Step 4. Open a folder in Visual Studio Code.
  • Step 5. Open or create a Python file inside this folder. The "RUN" button in the taskbar at the bottom will run your file with the teaching language provided by write-your-python-program.

Troubleshooting

  • By default, the Visual Studio Code extension uses the Python interpreter of the regular Python extension, but you may also configure it explicitly. Configuration can be done either by selecting the desired Python version in the left corner of the status bar (at the bottom of the window), or by setting the path the the python executable in the settings of the plugin.

Usage without Visual Studio Code

Write Your Python Program can be installed outside of Visual Studio Code via pip:

pip3 install wypp

After installation, you can use the wypp command for running your python files, making all features explained below available. Run wypp --help for usage information.

Features

Here is a screen shot:

Screenshot

There is also a visualization mode, similar to Python Tutor: Screenshot

When hitting the RUN button, the vscode extension saves the current file, opens a terminal and executes the file with Python, staying in interactive mode after all definitions have been executed.

The file being executed should contain the following import statement in the first line:

fromwyppimport*

Running the file with the RUN button makes the following features available:

Type Definitions

You can define enums, records and union data types and the use them with the type hints of Python 3. Type hints are checked for correctness dynamically, i.e. violations are detected only at the moment when a function is applied to an argument not matching its type hint or when a function returns a value not matching the return type hint. (This approach is similar to contract checking in racket)

Enums

type Color=Literal['red', 'green', 'blue']

Records

@recordclassPoint:
x: floaty: float@recordclassSquare:
center: Pointwidth: float@recordclassCircle:
center: Pointradius: float

You work with a record like this:

p=Point(2, 3) # point at x=2, y=3print(p.x) # Prints 2

Fields of records are immutable by default. You get mutable fields with @record(mutable=True).

Mixed Data Types

type PrimitiveShape=Union[Circle, Square]

To use recursive types, you need to write a forward reference to the yet undefined type as a string:

type Shape=Union[Circle, Square, 'Overlay']
@recordclassOverlay:
top: Shapebottom: Shape

Case distinction works like this:

defworkOnShape(s: Shape) ->None:
ifisinstance(s, Square):
# s is a Square, do something with itpasselifisinstance(s, Circle):
# s is a Circle, do something with itpasselifisinstance(s, Overlay):
# s is an Overlay, do something with itpass

The body of workOnShape can safely assume that s is indeed one Square, Circle, or Overlay because the type hint Shape for argument s is checked dynamically. Here is what happens if you apply workOnShape to, say, a string, that is workOnShape('foo').

Traceback (most recent call last):
File "test.py", line 42, in <module>
workOnShape("foo")
WyppTypeError: got value of wrong type
given: 'foo'
expected: value of type Union[Circle, Square, Overlay]
context: workOnShape(s: Union[Circle, Square, Overlay]) -> None
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
declared at: test.py:31
caused by: test.py:42
| workOnShape("foo")

Tests

Tests are defined via check. The first argument of check is the actual result, then second argument the expected result.

check(factorial(4), 24)

Annotations

All python types (builtin or from the typing module) can be used as annotations. Also, you can use every class as a type. In addition, WYPP comes with the following predefined types:

  • floatNegative
  • floatNonNegative
  • floatNonPositive
  • floatPositive
  • intNegative
  • intNonNegative
  • intNonPositive
  • intPositive
  • nat

The code is run with from __future__ import annotations (see PEP 563). This means that you can use a type as an annotation before the type being defined, for example to define recursive types or as the type of self inside of classes. In fact, there is no check at all to make sure that anotations refer to existing types.

Module name and current working directory

When executing a python file with the RUN button, the current working directory is set to the directory of the file being executed. The __name__ attribute is set to the value '__wypp__'.

What's new?

Here is the Changelog.

  • Breaking change in version 2.0.0 (2025-09-24): type annotations are now only checked when entering/exiting a function. Before, certain things such as lists or callable were put behind wrapper objects. For example, these wrappers ensured that only ints could be appended to a list of type list[int]. However, these wrappers came with several drawbacks, so they were removed in release 2.0.0
  • Breaking change in version 0.12.0 (2021-09-28): type annotations are now checked dynamically when the code is executed. This behavior can be deactivated in the settings of the extension.
  • Breaking change in version 0.11.0 (2021-03-11): wypp is no longer automatically imported. You need an explicit import statement such as from wypp import *.

Bugs & Problems

Please report them in the issue tracker.

Hacking

You can debug the extension from Visual Studio Code:

  • npm install
  • npm run build
  • Open the main folder of the plugin with vscode.
  • Open the file extension.ts.
  • Choose "Run" from the menu, then "Start Debugging".

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Write Your Python Program

A user-friendly python programming environment for beginners.

The ideas of this environment are based on the great ideas from Schreib dein Programm!.

Quick start

  • Step 1. Install Python 3.12.x or Python 3.13.x or Python 3.14.x.
  • Step 2. Install Visual Studio Code, at least version Version: 1.94.2
  • Step 3. Install the write-your-python-program extension for Visual Studio Code.
  • Step 4. Open a folder in Visual Studio Code.
  • Step 5. Open or create a Python file inside this folder. The "RUN" button in the taskbar at the bottom will run your file with the teaching language provided by write-your-python-program.

Troubleshooting

  • By default, the Visual Studio Code extension uses the Python interpreter of the regular Python extension, but you may also configure it explicitly. Configuration can be done either by selecting the desired Python version in the left corner of the status bar (at the bottom of the window), or by setting the path the the python executable in the settings of the plugin.

Usage without Visual Studio Code

Write Your Python Program can be installed outside of Visual Studio Code via pip:

pip3 install wypp

After installation, you can use the wypp command for running your python files, making all features explained below available. Run wypp --help for usage information.

Features

Here is a screen shot:

Screenshot

There is also a visualization mode, similar to Python Tutor: Screenshot

When hitting the RUN button, the vscode extension saves the current file, opens a terminal and executes the file with Python, staying in interactive mode after all definitions have been executed.

The file being executed should contain the following import statement in the first line:

fromwyppimport*

Running the file with the RUN button makes the following features available:

Type Definitions

You can define enums, records and union data types and the use them with the type hints of Python 3. Type hints are checked for correctness dynamically, i.e. violations are detected only at the moment when a function is applied to an argument not matching its type hint or when a function returns a value not matching the return type hint. (This approach is similar to contract checking in racket)

Enums

type Color=Literal['red', 'green', 'blue']

Records

@recordclassPoint:
x: floaty: float@recordclassSquare:
center: Pointwidth: float@recordclassCircle:
center: Pointradius: float

You work with a record like this:

p=Point(2, 3) # point at x=2, y=3print(p.x) # Prints 2

Fields of records are immutable by default. You get mutable fields with @record(mutable=True).

Mixed Data Types

type PrimitiveShape=Union[Circle, Square]

To use recursive types, you need to write a forward reference to the yet undefined type as a string:

type Shape=Union[Circle, Square, 'Overlay']
@recordclassOverlay:
top: Shapebottom: Shape

Case distinction works like this:

defworkOnShape(s: Shape) ->None:
ifisinstance(s, Square):
# s is a Square, do something with itpasselifisinstance(s, Circle):
# s is a Circle, do something with itpasselifisinstance(s, Overlay):
# s is an Overlay, do something with itpass

The body of workOnShape can safely assume that s is indeed one Square, Circle, or Overlay because the type hint Shape for argument s is checked dynamically. Here is what happens if you apply workOnShape to, say, a string, that is workOnShape('foo').

Traceback (most recent call last):
File "test.py", line 42, in <module>
workOnShape("foo")
WyppTypeError: got value of wrong type
given: 'foo'
expected: value of type Union[Circle, Square, Overlay]
context: workOnShape(s: Union[Circle, Square, Overlay]) -> None
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
declared at: test.py:31
caused by: test.py:42
| workOnShape("foo")

Tests

Tests are defined via check. The first argument of check is the actual result, then second argument the expected result.

check(factorial(4), 24)

Annotations

All python types (builtin or from the typing module) can be used as annotations. Also, you can use every class as a type. In addition, WYPP comes with the following predefined types:

  • floatNegative
  • floatNonNegative
  • floatNonPositive
  • floatPositive
  • intNegative
  • intNonNegative
  • intNonPositive
  • intPositive
  • nat

The code is run with from __future__ import annotations (see PEP 563). This means that you can use a type as an annotation before the type being defined, for example to define recursive types or as the type of self inside of classes. In fact, there is no check at all to make sure that anotations refer to existing types.

Module name and current working directory

When executing a python file with the RUN button, the current working directory is set to the directory of the file being executed. The __name__ attribute is set to the value '__wypp__'.

What's new?

Here is the Changelog.

  • Breaking change in version 2.0.0 (2025-09-24): type annotations are now only checked when entering/exiting a function. Before, certain things such as lists or callable were put behind wrapper objects. For example, these wrappers ensured that only ints could be appended to a list of type list[int]. However, these wrappers came with several drawbacks, so they were removed in release 2.0.0
  • Breaking change in version 0.12.0 (2021-09-28): type annotations are now checked dynamically when the code is executed. This behavior can be deactivated in the settings of the extension.
  • Breaking change in version 0.11.0 (2021-03-11): wypp is no longer automatically imported. You need an explicit import statement such as from wypp import *.

Bugs & Problems

Please report them in the issue tracker.

Hacking

You can debug the extension from Visual Studio Code:

  • npm install
  • npm run build
  • Open the main folder of the plugin with vscode.
  • Open the file extension.ts.
  • Choose "Run" from the menu, then "Start Debugging".

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Write Your Python Program

A user-friendly python programming environment for beginners.

The ideas of this environment are based on the great ideas from Schreib dein Programm!.

Quick start

  • Step 1. Install Python 3.12.x or Python 3.13.x or Python 3.14.x.
  • Step 2. Install Visual Studio Code, at least version Version: 1.94.2
  • Step 3. Install the write-your-python-program extension for Visual Studio Code.
  • Step 4. Open a folder in Visual Studio Code.
  • Step 5. Open or create a Python file inside this folder. The "RUN" button in the taskbar at the bottom will run your file with the teaching language provided by write-your-python-program.

Troubleshooting

  • By default, the Visual Studio Code extension uses the Python interpreter of the regular Python extension, but you may also configure it explicitly. Configuration can be done either by selecting the desired Python version in the left corner of the status bar (at the bottom of the window), or by setting the path the the python executable in the settings of the plugin.

Usage without Visual Studio Code

Write Your Python Program can be installed outside of Visual Studio Code via pip:

pip3 install wypp

After installation, you can use the wypp command for running your python files, making all features explained below available. Run wypp --help for usage information.

Features

Here is a screen shot:

Screenshot

There is also a visualization mode, similar to Python Tutor: Screenshot

When hitting the RUN button, the vscode extension saves the current file, opens a terminal and executes the file with Python, staying in interactive mode after all definitions have been executed.

The file being executed should contain the following import statement in the first line:

fromwyppimport*

Running the file with the RUN button makes the following features available:

Type Definitions

You can define enums, records and union data types and the use them with the type hints of Python 3. Type hints are checked for correctness dynamically, i.e. violations are detected only at the moment when a function is applied to an argument not matching its type hint or when a function returns a value not matching the return type hint. (This approach is similar to contract checking in racket)

Enums

type Color=Literal['red', 'green', 'blue']

Records

@recordclassPoint:
x: floaty: float@recordclassSquare:
center: Pointwidth: float@recordclassCircle:
center: Pointradius: float

You work with a record like this:

p=Point(2, 3) # point at x=2, y=3print(p.x) # Prints 2

Fields of records are immutable by default. You get mutable fields with @record(mutable=True).

Mixed Data Types

type PrimitiveShape=Union[Circle, Square]

To use recursive types, you need to write a forward reference to the yet undefined type as a string:

type Shape=Union[Circle, Square, 'Overlay']
@recordclassOverlay:
top: Shapebottom: Shape

Case distinction works like this:

defworkOnShape(s: Shape) ->None:
ifisinstance(s, Square):
# s is a Square, do something with itpasselifisinstance(s, Circle):
# s is a Circle, do something with itpasselifisinstance(s, Overlay):
# s is an Overlay, do something with itpass

The body of workOnShape can safely assume that s is indeed one Square, Circle, or Overlay because the type hint Shape for argument s is checked dynamically. Here is what happens if you apply workOnShape to, say, a string, that is workOnShape('foo').

Traceback (most recent call last):
File "test.py", line 42, in <module>
workOnShape("foo")
WyppTypeError: got value of wrong type
given: 'foo'
expected: value of type Union[Circle, Square, Overlay]
context: workOnShape(s: Union[Circle, Square, Overlay]) -> None
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
declared at: test.py:31
caused by: test.py:42
| workOnShape("foo")

Tests

Tests are defined via check. The first argument of check is the actual result, then second argument the expected result.

check(factorial(4), 24)

Annotations

All python types (builtin or from the typing module) can be used as annotations. Also, you can use every class as a type. In addition, WYPP comes with the following predefined types:

  • floatNegative
  • floatNonNegative
  • floatNonPositive
  • floatPositive
  • intNegative
  • intNonNegative
  • intNonPositive
  • intPositive
  • nat

The code is run with from __future__ import annotations (see PEP 563). This means that you can use a type as an annotation before the type being defined, for example to define recursive types or as the type of self inside of classes. In fact, there is no check at all to make sure that anotations refer to existing types.

Module name and current working directory

When executing a python file with the RUN button, the current working directory is set to the directory of the file being executed. The __name__ attribute is set to the value '__wypp__'.

What's new?

Here is the Changelog.

  • Breaking change in version 2.0.0 (2025-09-24): type annotations are now only checked when entering/exiting a function. Before, certain things such as lists or callable were put behind wrapper objects. For example, these wrappers ensured that only ints could be appended to a list of type list[int]. However, these wrappers came with several drawbacks, so they were removed in release 2.0.0
  • Breaking change in version 0.12.0 (2021-09-28): type annotations are now checked dynamically when the code is executed. This behavior can be deactivated in the settings of the extension.
  • Breaking change in version 0.11.0 (2021-03-11): wypp is no longer automatically imported. You need an explicit import statement such as from wypp import *.

Bugs & Problems

Please report them in the issue tracker.

Hacking

You can debug the extension from Visual Studio Code:

  • npm install
  • npm run build
  • Open the main folder of the plugin with vscode.
  • Open the file extension.ts.
  • Choose "Run" from the menu, then "Start Debugging".

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Write Your Python Program

A user-friendly python programming environment for beginners.

The ideas of this environment are based on the great ideas from Schreib dein Programm!.

Quick start

  • Step 1. Install Python 3.12.x or Python 3.13.x or Python 3.14.x.
  • Step 2. Install Visual Studio Code, at least version Version: 1.94.2
  • Step 3. Install the write-your-python-program extension for Visual Studio Code.
  • Step 4. Open a folder in Visual Studio Code.
  • Step 5. Open or create a Python file inside this folder. The "RUN" button in the taskbar at the bottom will run your file with the teaching language provided by write-your-python-program.

Troubleshooting

  • By default, the Visual Studio Code extension uses the Python interpreter of the regular Python extension, but you may also configure it explicitly. Configuration can be done either by selecting the desired Python version in the left corner of the status bar (at the bottom of the window), or by setting the path the the python executable in the settings of the plugin.

Usage without Visual Studio Code

Write Your Python Program can be installed outside of Visual Studio Code via pip:

pip3 install wypp

After installation, you can use the wypp command for running your python files, making all features explained below available. Run wypp --help for usage information.

Features

Here is a screen shot:

Screenshot

There is also a visualization mode, similar to Python Tutor: Screenshot

When hitting the RUN button, the vscode extension saves the current file, opens a terminal and executes the file with Python, staying in interactive mode after all definitions have been executed.

The file being executed should contain the following import statement in the first line:

fromwyppimport*

Running the file with the RUN button makes the following features available:

Type Definitions

You can define enums, records and union data types and the use them with the type hints of Python 3. Type hints are checked for correctness dynamically, i.e. violations are detected only at the moment when a function is applied to an argument not matching its type hint or when a function returns a value not matching the return type hint. (This approach is similar to contract checking in racket)

Enums

type Color=Literal['red', 'green', 'blue']

Records

@recordclassPoint:
x: floaty: float@recordclassSquare:
center: Pointwidth: float@recordclassCircle:
center: Pointradius: float

You work with a record like this:

p=Point(2, 3) # point at x=2, y=3print(p.x) # Prints 2

Fields of records are immutable by default. You get mutable fields with @record(mutable=True).

Mixed Data Types

type PrimitiveShape=Union[Circle, Square]

To use recursive types, you need to write a forward reference to the yet undefined type as a string:

type Shape=Union[Circle, Square, 'Overlay']
@recordclassOverlay:
top: Shapebottom: Shape

Case distinction works like this:

defworkOnShape(s: Shape) ->None:
ifisinstance(s, Square):
# s is a Square, do something with itpasselifisinstance(s, Circle):
# s is a Circle, do something with itpasselifisinstance(s, Overlay):
# s is an Overlay, do something with itpass

The body of workOnShape can safely assume that s is indeed one Square, Circle, or Overlay because the type hint Shape for argument s is checked dynamically. Here is what happens if you apply workOnShape to, say, a string, that is workOnShape('foo').

Traceback (most recent call last):
File "test.py", line 42, in <module>
workOnShape("foo")
WyppTypeError: got value of wrong type
given: 'foo'
expected: value of type Union[Circle, Square, Overlay]
context: workOnShape(s: Union[Circle, Square, Overlay]) -> None
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
declared at: test.py:31
caused by: test.py:42
| workOnShape("foo")

Tests

Tests are defined via check. The first argument of check is the actual result, then second argument the expected result.

check(factorial(4), 24)

Annotations

All python types (builtin or from the typing module) can be used as annotations. Also, you can use every class as a type. In addition, WYPP comes with the following predefined types:

  • floatNegative
  • floatNonNegative
  • floatNonPositive
  • floatPositive
  • intNegative
  • intNonNegative
  • intNonPositive
  • intPositive
  • nat

The code is run with from __future__ import annotations (see PEP 563). This means that you can use a type as an annotation before the type being defined, for example to define recursive types or as the type of self inside of classes. In fact, there is no check at all to make sure that anotations refer to existing types.

Module name and current working directory

When executing a python file with the RUN button, the current working directory is set to the directory of the file being executed. The __name__ attribute is set to the value '__wypp__'.

What's new?

Here is the Changelog.

  • Breaking change in version 2.0.0 (2025-09-24): type annotations are now only checked when entering/exiting a function. Before, certain things such as lists or callable were put behind wrapper objects. For example, these wrappers ensured that only ints could be appended to a list of type list[int]. However, these wrappers came with several drawbacks, so they were removed in release 2.0.0
  • Breaking change in version 0.12.0 (2021-09-28): type annotations are now checked dynamically when the code is executed. This behavior can be deactivated in the settings of the extension.
  • Breaking change in version 0.11.0 (2021-03-11): wypp is no longer automatically imported. You need an explicit import statement such as from wypp import *.

Bugs & Problems

Please report them in the issue tracker.

Hacking

You can debug the extension from Visual Studio Code:

  • npm install
  • npm run build
  • Open the main folder of the plugin with vscode.
  • Open the file extension.ts.
  • Choose "Run" from the menu, then "Start Debugging".

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Write Your Python Program

A user-friendly python programming environment for beginners.

The ideas of this environment are based on the great ideas from Schreib dein Programm!.

Quick start

  • Step 1. Install Python 3.12.x or Python 3.13.x or Python 3.14.x.
  • Step 2. Install Visual Studio Code, at least version Version: 1.94.2
  • Step 3. Install the write-your-python-program extension for Visual Studio Code.
  • Step 4. Open a folder in Visual Studio Code.
  • Step 5. Open or create a Python file inside this folder. The "RUN" button in the taskbar at the bottom will run your file with the teaching language provided by write-your-python-program.

Troubleshooting

  • By default, the Visual Studio Code extension uses the Python interpreter of the regular Python extension, but you may also configure it explicitly. Configuration can be done either by selecting the desired Python version in the left corner of the status bar (at the bottom of the window), or by setting the path the the python executable in the settings of the plugin.

Usage without Visual Studio Code

Write Your Python Program can be installed outside of Visual Studio Code via pip:

pip3 install wypp

After installation, you can use the wypp command for running your python files, making all features explained below available. Run wypp --help for usage information.

Features

Here is a screen shot:

Screenshot

There is also a visualization mode, similar to Python Tutor: Screenshot

When hitting the RUN button, the vscode extension saves the current file, opens a terminal and executes the file with Python, staying in interactive mode after all definitions have been executed.

The file being executed should contain the following import statement in the first line:

fromwyppimport*

Running the file with the RUN button makes the following features available:

Type Definitions

You can define enums, records and union data types and the use them with the type hints of Python 3. Type hints are checked for correctness dynamically, i.e. violations are detected only at the moment when a function is applied to an argument not matching its type hint or when a function returns a value not matching the return type hint. (This approach is similar to contract checking in racket)

Enums

type Color=Literal['red', 'green', 'blue']

Records

@recordclassPoint:
x: floaty: float@recordclassSquare:
center: Pointwidth: float@recordclassCircle:
center: Pointradius: float

You work with a record like this:

p=Point(2, 3) # point at x=2, y=3print(p.x) # Prints 2

Fields of records are immutable by default. You get mutable fields with @record(mutable=True).

Mixed Data Types

type PrimitiveShape=Union[Circle, Square]

To use recursive types, you need to write a forward reference to the yet undefined type as a string:

type Shape=Union[Circle, Square, 'Overlay']
@recordclassOverlay:
top: Shapebottom: Shape

Case distinction works like this:

defworkOnShape(s: Shape) ->None:
ifisinstance(s, Square):
# s is a Square, do something with itpasselifisinstance(s, Circle):
# s is a Circle, do something with itpasselifisinstance(s, Overlay):
# s is an Overlay, do something with itpass

The body of workOnShape can safely assume that s is indeed one Square, Circle, or Overlay because the type hint Shape for argument s is checked dynamically. Here is what happens if you apply workOnShape to, say, a string, that is workOnShape('foo').

Traceback (most recent call last):
File "test.py", line 42, in <module>
workOnShape("foo")
WyppTypeError: got value of wrong type
given: 'foo'
expected: value of type Union[Circle, Square, Overlay]
context: workOnShape(s: Union[Circle, Square, Overlay]) -> None
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
declared at: test.py:31
caused by: test.py:42
| workOnShape("foo")

Tests

Tests are defined via check. The first argument of check is the actual result, then second argument the expected result.

check(factorial(4), 24)

Annotations

All python types (builtin or from the typing module) can be used as annotations. Also, you can use every class as a type. In addition, WYPP comes with the following predefined types:

  • floatNegative
  • floatNonNegative
  • floatNonPositive
  • floatPositive
  • intNegative
  • intNonNegative
  • intNonPositive
  • intPositive
  • nat

The code is run with from __future__ import annotations (see PEP 563). This means that you can use a type as an annotation before the type being defined, for example to define recursive types or as the type of self inside of classes. In fact, there is no check at all to make sure that anotations refer to existing types.

Module name and current working directory

When executing a python file with the RUN button, the current working directory is set to the directory of the file being executed. The __name__ attribute is set to the value '__wypp__'.

What's new?

Here is the Changelog.

  • Breaking change in version 2.0.0 (2025-09-24): type annotations are now only checked when entering/exiting a function. Before, certain things such as lists or callable were put behind wrapper objects. For example, these wrappers ensured that only ints could be appended to a list of type list[int]. However, these wrappers came with several drawbacks, so they were removed in release 2.0.0
  • Breaking change in version 0.12.0 (2021-09-28): type annotations are now checked dynamically when the code is executed. This behavior can be deactivated in the settings of the extension.
  • Breaking change in version 0.11.0 (2021-03-11): wypp is no longer automatically imported. You need an explicit import statement such as from wypp import *.

Bugs & Problems

Please report them in the issue tracker.

Hacking

You can debug the extension from Visual Studio Code:

  • npm install
  • npm run build
  • Open the main folder of the plugin with vscode.
  • Open the file extension.ts.
  • Choose "Run" from the menu, then "Start Debugging".

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Write Your Python Program

A user-friendly python programming environment for beginners.

The ideas of this environment are based on the great ideas from Schreib dein Programm!.

Quick start

  • Step 1. Install Python 3.12.x or Python 3.13.x or Python 3.14.x.
  • Step 2. Install Visual Studio Code, at least version Version: 1.94.2
  • Step 3. Install the write-your-python-program extension for Visual Studio Code.
  • Step 4. Open a folder in Visual Studio Code.
  • Step 5. Open or create a Python file inside this folder. The "RUN" button in the taskbar at the bottom will run your file with the teaching language provided by write-your-python-program.

Troubleshooting

  • By default, the Visual Studio Code extension uses the Python interpreter of the regular Python extension, but you may also configure it explicitly. Configuration can be done either by selecting the desired Python version in the left corner of the status bar (at the bottom of the window), or by setting the path the the python executable in the settings of the plugin.

Usage without Visual Studio Code

Write Your Python Program can be installed outside of Visual Studio Code via pip:

pip3 install wypp

After installation, you can use the wypp command for running your python files, making all features explained below available. Run wypp --help for usage information.

Features

Here is a screen shot:

Screenshot

There is also a visualization mode, similar to Python Tutor: Screenshot

When hitting the RUN button, the vscode extension saves the current file, opens a terminal and executes the file with Python, staying in interactive mode after all definitions have been executed.

The file being executed should contain the following import statement in the first line:

fromwyppimport*

Running the file with the RUN button makes the following features available:

Type Definitions

You can define enums, records and union data types and the use them with the type hints of Python 3. Type hints are checked for correctness dynamically, i.e. violations are detected only at the moment when a function is applied to an argument not matching its type hint or when a function returns a value not matching the return type hint. (This approach is similar to contract checking in racket)

Enums

type Color=Literal['red', 'green', 'blue']

Records

@recordclassPoint:
x: floaty: float@recordclassSquare:
center: Pointwidth: float@recordclassCircle:
center: Pointradius: float

You work with a record like this:

p=Point(2, 3) # point at x=2, y=3print(p.x) # Prints 2

Fields of records are immutable by default. You get mutable fields with @record(mutable=True).

Mixed Data Types

type PrimitiveShape=Union[Circle, Square]

To use recursive types, you need to write a forward reference to the yet undefined type as a string:

type Shape=Union[Circle, Square, 'Overlay']
@recordclassOverlay:
top: Shapebottom: Shape

Case distinction works like this:

defworkOnShape(s: Shape) ->None:
ifisinstance(s, Square):
# s is a Square, do something with itpasselifisinstance(s, Circle):
# s is a Circle, do something with itpasselifisinstance(s, Overlay):
# s is an Overlay, do something with itpass

The body of workOnShape can safely assume that s is indeed one Square, Circle, or Overlay because the type hint Shape for argument s is checked dynamically. Here is what happens if you apply workOnShape to, say, a string, that is workOnShape('foo').

Traceback (most recent call last):
File "test.py", line 42, in <module>
workOnShape("foo")
WyppTypeError: got value of wrong type
given: 'foo'
expected: value of type Union[Circle, Square, Overlay]
context: workOnShape(s: Union[Circle, Square, Overlay]) -> None
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
declared at: test.py:31
caused by: test.py:42
| workOnShape("foo")

Tests

Tests are defined via check. The first argument of check is the actual result, then second argument the expected result.

check(factorial(4), 24)

Annotations

All python types (builtin or from the typing module) can be used as annotations. Also, you can use every class as a type. In addition, WYPP comes with the following predefined types:

  • floatNegative
  • floatNonNegative
  • floatNonPositive
  • floatPositive
  • intNegative
  • intNonNegative
  • intNonPositive
  • intPositive
  • nat

The code is run with from __future__ import annotations (see PEP 563). This means that you can use a type as an annotation before the type being defined, for example to define recursive types or as the type of self inside of classes. In fact, there is no check at all to make sure that anotations refer to existing types.

Module name and current working directory

When executing a python file with the RUN button, the current working directory is set to the directory of the file being executed. The __name__ attribute is set to the value '__wypp__'.

What's new?

Here is the Changelog.

  • Breaking change in version 2.0.0 (2025-09-24): type annotations are now only checked when entering/exiting a function. Before, certain things such as lists or callable were put behind wrapper objects. For example, these wrappers ensured that only ints could be appended to a list of type list[int]. However, these wrappers came with several drawbacks, so they were removed in release 2.0.0
  • Breaking change in version 0.12.0 (2021-09-28): type annotations are now checked dynamically when the code is executed. This behavior can be deactivated in the settings of the extension.
  • Breaking change in version 0.11.0 (2021-03-11): wypp is no longer automatically imported. You need an explicit import statement such as from wypp import *.

Bugs & Problems

Please report them in the issue tracker.

Hacking

You can debug the extension from Visual Studio Code:

  • npm install
  • npm run build
  • Open the main folder of the plugin with vscode.
  • Open the file extension.ts.
  • Choose "Run" from the menu, then "Start Debugging".

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Write Your Python Program

A user-friendly python programming environment for beginners.

The ideas of this environment are based on the great ideas from Schreib dein Programm!.

Quick start

  • Step 1. Install Python 3.12.x or Python 3.13.x or Python 3.14.x.
  • Step 2. Install Visual Studio Code, at least version Version: 1.94.2
  • Step 3. Install the write-your-python-program extension for Visual Studio Code.
  • Step 4. Open a folder in Visual Studio Code.
  • Step 5. Open or create a Python file inside this folder. The "RUN" button in the taskbar at the bottom will run your file with the teaching language provided by write-your-python-program.

Troubleshooting

  • By default, the Visual Studio Code extension uses the Python interpreter of the regular Python extension, but you may also configure it explicitly. Configuration can be done either by selecting the desired Python version in the left corner of the status bar (at the bottom of the window), or by setting the path the the python executable in the settings of the plugin.

Usage without Visual Studio Code

Write Your Python Program can be installed outside of Visual Studio Code via pip:

pip3 install wypp

After installation, you can use the wypp command for running your python files, making all features explained below available. Run wypp --help for usage information.

Features

Here is a screen shot:

Screenshot

There is also a visualization mode, similar to Python Tutor: Screenshot

When hitting the RUN button, the vscode extension saves the current file, opens a terminal and executes the file with Python, staying in interactive mode after all definitions have been executed.

The file being executed should contain the following import statement in the first line:

fromwyppimport*

Running the file with the RUN button makes the following features available:

Type Definitions

You can define enums, records and union data types and the use them with the type hints of Python 3. Type hints are checked for correctness dynamically, i.e. violations are detected only at the moment when a function is applied to an argument not matching its type hint or when a function returns a value not matching the return type hint. (This approach is similar to contract checking in racket)

Enums

type Color=Literal['red', 'green', 'blue']

Records

@recordclassPoint:
x: floaty: float@recordclassSquare:
center: Pointwidth: float@recordclassCircle:
center: Pointradius: float

You work with a record like this:

p=Point(2, 3) # point at x=2, y=3print(p.x) # Prints 2

Fields of records are immutable by default. You get mutable fields with @record(mutable=True).

Mixed Data Types

type PrimitiveShape=Union[Circle, Square]

To use recursive types, you need to write a forward reference to the yet undefined type as a string:

type Shape=Union[Circle, Square, 'Overlay']
@recordclassOverlay:
top: Shapebottom: Shape

Case distinction works like this:

defworkOnShape(s: Shape) ->None:
ifisinstance(s, Square):
# s is a Square, do something with itpasselifisinstance(s, Circle):
# s is a Circle, do something with itpasselifisinstance(s, Overlay):
# s is an Overlay, do something with itpass

The body of workOnShape can safely assume that s is indeed one Square, Circle, or Overlay because the type hint Shape for argument s is checked dynamically. Here is what happens if you apply workOnShape to, say, a string, that is workOnShape('foo').

Traceback (most recent call last):
File "test.py", line 42, in <module>
workOnShape("foo")
WyppTypeError: got value of wrong type
given: 'foo'
expected: value of type Union[Circle, Square, Overlay]
context: workOnShape(s: Union[Circle, Square, Overlay]) -> None
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
declared at: test.py:31
caused by: test.py:42
| workOnShape("foo")

Tests

Tests are defined via check. The first argument of check is the actual result, then second argument the expected result.

check(factorial(4), 24)

Annotations

All python types (builtin or from the typing module) can be used as annotations. Also, you can use every class as a type. In addition, WYPP comes with the following predefined types:

  • floatNegative
  • floatNonNegative
  • floatNonPositive
  • floatPositive
  • intNegative
  • intNonNegative
  • intNonPositive
  • intPositive
  • nat

The code is run with from __future__ import annotations (see PEP 563). This means that you can use a type as an annotation before the type being defined, for example to define recursive types or as the type of self inside of classes. In fact, there is no check at all to make sure that anotations refer to existing types.

Module name and current working directory

When executing a python file with the RUN button, the current working directory is set to the directory of the file being executed. The __name__ attribute is set to the value '__wypp__'.

What's new?

Here is the Changelog.

  • Breaking change in version 2.0.0 (2025-09-24): type annotations are now only checked when entering/exiting a function. Before, certain things such as lists or callable were put behind wrapper objects. For example, these wrappers ensured that only ints could be appended to a list of type list[int]. However, these wrappers came with several drawbacks, so they were removed in release 2.0.0
  • Breaking change in version 0.12.0 (2021-09-28): type annotations are now checked dynamically when the code is executed. This behavior can be deactivated in the settings of the extension.
  • Breaking change in version 0.11.0 (2021-03-11): wypp is no longer automatically imported. You need an explicit import statement such as from wypp import *.

Bugs & Problems

Please report them in the issue tracker.

Hacking

You can debug the extension from Visual Studio Code:

  • npm install
  • npm run build
  • Open the main folder of the plugin with vscode.
  • Open the file extension.ts.
  • Choose "Run" from the menu, then "Start Debugging".

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Write Your Python Program

A user-friendly python programming environment for beginners.

The ideas of this environment are based on the great ideas from Schreib dein Programm!.

Quick start

  • Step 1. Install Python 3.12.x or Python 3.13.x or Python 3.14.x.
  • Step 2. Install Visual Studio Code, at least version Version: 1.94.2
  • Step 3. Install the write-your-python-program extension for Visual Studio Code.
  • Step 4. Open a folder in Visual Studio Code.
  • Step 5. Open or create a Python file inside this folder. The "RUN" button in the taskbar at the bottom will run your file with the teaching language provided by write-your-python-program.

Troubleshooting

  • By default, the Visual Studio Code extension uses the Python interpreter of the regular Python extension, but you may also configure it explicitly. Configuration can be done either by selecting the desired Python version in the left corner of the status bar (at the bottom of the window), or by setting the path the the python executable in the settings of the plugin.

Usage without Visual Studio Code

Write Your Python Program can be installed outside of Visual Studio Code via pip:

pip3 install wypp

After installation, you can use the wypp command for running your python files, making all features explained below available. Run wypp --help for usage information.

Features

Here is a screen shot:

Screenshot

There is also a visualization mode, similar to Python Tutor: Screenshot

When hitting the RUN button, the vscode extension saves the current file, opens a terminal and executes the file with Python, staying in interactive mode after all definitions have been executed.

The file being executed should contain the following import statement in the first line:

fromwyppimport*

Running the file with the RUN button makes the following features available:

Type Definitions

You can define enums, records and union data types and the use them with the type hints of Python 3. Type hints are checked for correctness dynamically, i.e. violations are detected only at the moment when a function is applied to an argument not matching its type hint or when a function returns a value not matching the return type hint. (This approach is similar to contract checking in racket)

Enums

type Color=Literal['red', 'green', 'blue']

Records

@recordclassPoint:
x: floaty: float@recordclassSquare:
center: Pointwidth: float@recordclassCircle:
center: Pointradius: float

You work with a record like this:

p=Point(2, 3) # point at x=2, y=3print(p.x) # Prints 2

Fields of records are immutable by default. You get mutable fields with @record(mutable=True).

Mixed Data Types

type PrimitiveShape=Union[Circle, Square]

To use recursive types, you need to write a forward reference to the yet undefined type as a string:

type Shape=Union[Circle, Square, 'Overlay']
@recordclassOverlay:
top: Shapebottom: Shape

Case distinction works like this:

defworkOnShape(s: Shape) ->None:
ifisinstance(s, Square):
# s is a Square, do something with itpasselifisinstance(s, Circle):
# s is a Circle, do something with itpasselifisinstance(s, Overlay):
# s is an Overlay, do something with itpass

The body of workOnShape can safely assume that s is indeed one Square, Circle, or Overlay because the type hint Shape for argument s is checked dynamically. Here is what happens if you apply workOnShape to, say, a string, that is workOnShape('foo').

Traceback (most recent call last):
File "test.py", line 42, in <module>
workOnShape("foo")
WyppTypeError: got value of wrong type
given: 'foo'
expected: value of type Union[Circle, Square, Overlay]
context: workOnShape(s: Union[Circle, Square, Overlay]) -> None
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
declared at: test.py:31
caused by: test.py:42
| workOnShape("foo")

Tests

Tests are defined via check. The first argument of check is the actual result, then second argument the expected result.

check(factorial(4), 24)

Annotations

All python types (builtin or from the typing module) can be used as annotations. Also, you can use every class as a type. In addition, WYPP comes with the following predefined types:

  • floatNegative
  • floatNonNegative
  • floatNonPositive
  • floatPositive
  • intNegative
  • intNonNegative
  • intNonPositive
  • intPositive
  • nat

The code is run with from __future__ import annotations (see PEP 563). This means that you can use a type as an annotation before the type being defined, for example to define recursive types or as the type of self inside of classes. In fact, there is no check at all to make sure that anotations refer to existing types.

Module name and current working directory

When executing a python file with the RUN button, the current working directory is set to the directory of the file being executed. The __name__ attribute is set to the value '__wypp__'.

What's new?

Here is the Changelog.

  • Breaking change in version 2.0.0 (2025-09-24): type annotations are now only checked when entering/exiting a function. Before, certain things such as lists or callable were put behind wrapper objects. For example, these wrappers ensured that only ints could be appended to a list of type list[int]. However, these wrappers came with several drawbacks, so they were removed in release 2.0.0
  • Breaking change in version 0.12.0 (2021-09-28): type annotations are now checked dynamically when the code is executed. This behavior can be deactivated in the settings of the extension.
  • Breaking change in version 0.11.0 (2021-03-11): wypp is no longer automatically imported. You need an explicit import statement such as from wypp import *.

Bugs & Problems

Please report them in the issue tracker.

Hacking

You can debug the extension from Visual Studio Code:

  • npm install
  • npm run build
  • Open the main folder of the plugin with vscode.
  • Open the file extension.ts.
  • Choose "Run" from the menu, then "Start Debugging".

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages