Skip to main content

image

Mamushi

image Build Status codecov License: MIT Code style: black

Mamushi is a fork of the popular Black formatter adapted to the Vyper programming language. Mamushi reformats your Vyper contracts in a readable and consistent way.

Installation

pip install mamushi

Usage

Search all *.vy files and overwrite them after formatting:

mamushi

Specify a list of *.vy files or directories and output to console after formatting:

mamushi [SRC]

Output the result to console instead of overwriting:

mamushi --in-place False

pre-commit

Add to your .pre-commit-config.yaml:

repos:
  - repo: https://github.com/benber86/mamushi
    rev: main
    hooks:
      - id: mamushi
        args: [ --line-length=100 ]

Notes

Line length

The default line length is 80. Line length can be adjusted by using the --line-length option.

AST Safety

By default, mamushi will compare the AST of your reformatted code with that of the original to ensure that the changes applied remain strictly formal. The option can be disabled with --safe False to speed things up.

Trailing commas

When handling expressions split by commas, mamushi follows Black's default behavior.

Mamushi also uses Black's magic trailing comma to give user the option to collapse a comma-separated expression into one line if possible. If a trailing comma is added, mamushi will always explode the expression. This can have important consequences for the commenting of your code. Consider the following two examples:

This code snippet:

self.b(0, # amount to send
       msg.sender, # sender
       True, # refund ?
        )

formats to the following with a trailing comma after the last argument (True):

self.b(
    0,  # amount to send
    msg.sender,  # sender
    True,  # refund ?
)

Disabling formatting

Mamushi supports # fmt: off and # fmt: on tags to disable formatting for specific regions of code:

x: uint256 = 1

# fmt: off
y:    uint256     =     2    # preserve this spacing
z:uint256=3
# fmt: on

a: uint256 = 4  # this will be formatted normally

The code between # fmt: off and # fmt: on will be preserved exactly as written, including all spacing and line breaks. These tags can be nested, and unclosed # fmt: off regions will extend to the end of the file.

You can also use # nosplit on individual lines to prevent line splitting while still applying spacing normalization:

assert not self.user[receiver][msg.sender], "Error message"  # nosplit

Note: # fmt: skip is not currently supported.

but if the trailing comma is removed, the line will be collapsed to:

self.b(0, msg.sender, True)  # amount to send  # sender  # refund ?

Future developments

  • Multiprocessing when processing multiple files
  • Configuration files
  • Improve Windows compatibility
  • Handle versioning of Vyper/lark grammar
  • Refactoring comment handling in the parser
  • Add .gitignore / exclude / include support

Metadata

Release files for mamushi 0.1.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for mamushi 0.1.2
File Size Uploaded
mamushi-0.1.2.tar.gz 48.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for mamushi 0.1.2
File Interpreter ABI Platform
mamushi-0.1.2-py3-none-any.whl Python 3 none any Details

Total release size: 98.0 kB

Release files / mamushi-0.1.2.tar.gz

Download URL mamushi-0.1.2.tar.gz
Size 48.1 kB
Tags Source
SHA-256 checksum
How to use checksums
e9303f56c566eb2bc0a039ba638eb97c03637bf5ecf3b4e9be91fb2bb1ff8d1f
BLAKE2b-256 checksum
How to use checksums
21c5a5988cb549c4210b6ce682905c78da0e1a289dc1ca8cbde0c08c49645d53
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 17, 2026.

Transparency log

Release files / mamushi-0.1.2-py3-none-any.whl

Download URL mamushi-0.1.2-py3-none-any.whl
Size 50.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
ab4a2a7cb975718f69d17964f59b560f10e405821d9bf3487908bba56b178f72
BLAKE2b-256 checksum
How to use checksums
4072d68bb1b036201b8c21a58c11fbcc0538a4709955623cf1c0b5520e842a9e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 17, 2026.

Transparency log
Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page