Skip to main content

Minimizes Python3 code

Project description

MiniPy3

Minimizes python3 code

Usage

CLI

usage: minipy3 [-h] [-o OUT] [--no-compress] [--unparse] [--no-suffix] input

positional arguments:
  input              Input files rglob

options:
  -h, --help         show this help message and exit
  -o OUT, --out OUT  Output files rglob
  --no-compress      Don't use compression algorithms (lzma, zlib, gzip or bz2)
  --unparse          Return from compressed to standard view
  --no-suffix        Add suffix to file name (max for --unparse else min)

Example

python -m minipy3 --no-suffix venv***.py

Will compress all .py files in the venv folder and its subfolders.

--no-suffix means that source files will be overwritten otherwise suffix .min will be added when minimizing or .max when restoring (argument --unparse) (main.py -> main.min.py | main.max.py)

Python

from minipy3 import *


class Minimize(AddSemicolon, ignore={'Import'}):
    """Class based on ast._Unparse for code compression (see ast.unparse)"""
    ...


def minimize(raw_code: str | bytes,
             compress: bool = True,
             compress_required: bool = False) -> str:
    """
    Minimizes the passed code with the help of the Minimizer class;
    And if necessary or gives more compression, applies one of the compression algorithms: (lzma, zlib, gzip, bz2)
    """
    ...

AddSemicolon

An additional utility is the ability to add semicolons in the code (as in swift, dart and generally everywhere)

class AddSemicolon(ast._Unparser):
    """Adds a semicolon where needed (see add_semicolon_after)"""
    __slots__ = ()
    add_semicolon_after = {'Return', 'Delete', 'Assign', 'AugAssign', 'AnnAssign', 'Raise', 'Assert', 'Import',
                           'ImportFrom', 'Global', 'Nonlocal', 'Expr', 'Pass', 'Break', 'Continue'}

    def and_add(self, func):
        """
        Decorate visitor functions.
        Designed for class extensibility.
        """
        ...

    def __init_subclass__(cls, **kwargs):
        """
        When inheriting a class,
        the ignore argument will exclude the specified sequence from the add_semicolon_after sequence.
        """
        ignore = kwargs.get('ignore', {*()})
        cls.add_semicolon_after ^= ignore

    def __init__(self, *args, **kwargs):
        """Applies the and_add decorator to visitor nodes specified by add_semicolon_after"""
        ...


def add_semicolons(raw_code: str | bytes) -> str: ...

Also happens:

  • Large numbers turn into powers of numbers
  • The sequence of imports is collected into one
  • Dockstrings get cut off, strip('\n') and dedent happen

Examples:

# semicolon.py ->
from __future__ import annotations;import ast,functools
class AddSemicolon(ast._Unparser):
 'Adds a semicolon where needed (see also ast.unparse)';__slots__=();add_semicolon_after={'Return','Delete','Assign','AugAssign','AnnAssign','Raise','Assert','Import','ImportFrom','Global','Nonlocal','Expr','Pass','Break','Continue'}
 def and_add(self,func):
  'Decorate visitor functions.\nDesigned for class extensibility.'
  @functools.wraps(func)
  def wrapper(*args,**kwargs):res=func(*args,**kwargs);self.write(';');return res
  return wrapper
 def __init_subclass__(cls,**kwargs):'When inheriting a class,\nthe ignore argument will exclude the specified sequence from the add_semicolon_after sequence.';ignore=kwargs.get('ignore',{*()});cls.add_semicolon_after^=ignore
 def __init__(self,*args,**kwargs):
  'Applies the and_add decorator to visitor nodes specified by add_semicolon_after';super().__init__(*args,**kwargs)
  for name in self.add_semicolon_after:
   name=f'visit_{name}'
   if hasattr(self,name):setattr(self,name,self.and_add(getattr(self,name)))
def add_semicolons(raw_code):return AddSemicolon().visit(ast.parse(raw_code))
# __init__.py (--no-compress to disable such compression)
exec(__import__('lzma').decompress(b']\x00\x00\x80\x00\xff\xff\xff\xff\xff\xff\xff\xff\x003\x1c\x8a"o\xaaD6D\xa6P\x82\x88\x10?\x1d\xcb^4\x0fYJY"\xa1\xcdfk\xb9\x04Ns\xa5\x08\x13SFB\xfd\x95\x11IPF)\x86\xa8\xf4$OH\xad\xa4\xb4\xd0\x82RM\x00\x8e\xc8s\xe7\x9d_0.:\x0e\n&j\x10\x94\xe5&\xd3m\xab\x18\x14r}\x04C$\xe5\xf3\xa5\xae\x8a\x8f\xe4\x7f5!\xb3u\x84\x1f\xecL\xaadz\xbb\xf2\n\xaa#a\x0c\xe0\xe8p\x16\xab\x01\x8aQ\x9e\x8f\xbb\xbd\x9d\x04\xfaP\xc1\xf1\xc4\xea\x926\x1c@\xe2\x1co\xd9\xd3)\xcf\xb2\xee\x94\x12\xedL\xa9\x05\xe3\x07V\x1d\xdb\xe4\x19\x00\x06\xd8iq\x01#/\x98\xdbfMS\x19\xf4\x93\xd1\xc8\xeb\xf6=\rz\xf4\xdf`\xef\xbd\x01~S2\xf8e=`\x88\xef\xe8\x80\x84\xc4\x0b\xd2\xb2h1\xb4{\xc8s\xe9\x9a\xf8k?\xa3s\xb2\xe7\xcd%\xe1\xd0\x11g\x00\xad \x02\xaac\xb0\x0e\xbc\x15\xe4\xc9=3}A)\xe3|\x10~U\xe1\x9d7u\x12\xb6\xce\x81~\xe7DD3\x89D\xef\xa2V\xea\x05\xa4y\x12\x17\xf2Ra\xc9a\xcc\x07\x96b\xef\\\xef\xdcb\xde02\x9f@\xa9\x96o\x9cZ\xf2\xa3\xbb\x0c\xad\xf0\xae\xcf\x87\xf2\xd6\x10w\x053\xbf\xd2s\xdf\x8eR\xcb\x01\n~w\xc2!\x1a\x83\x05\x9cP\xealh\xb0\xb3\x1c\xe3F\x86\x1d\xd8\xa3?\'\x0c8\x00\xedB\xf5\x8f\rS\t\x1eR`R\xe5\r\xfb\x83\x02O\x16\xce\t\xd9\xe7\xb2"`\xf4H\xd4W\xfd\xad\xf4\xbc\xa2._\x7fVE\x7f&\xd4\x1f\t\x13\xdbB?s\xd4\x19\x7f\xd6\x15h8\x89c\x9c\xd1\x14n\xc1%4\x8ap\xf7\x8f\xa6\x17\x15\x88c\x8e\xaa\xd6=r\xad\x07JH(\x13\xa78\xe2\xd1v8\xd82m\xbe-\x0c\x9b+\xb6\x05%g\xdc\x98k\xf8fSLD\xa6\xc01\xa5G\x8f\x8c\x89HT\xe9\x98.\xe1\xe0Qk\xfbMm\xbf\x11&\x15\xdb\xd3T:\xe6>\xd6\x7f.\xb4;>uC\x02\xce\xf1\x1c\xeeRZp\x8eODs?|\x1b/\xb4R>\x8fW\xe0\xbc1\xd8\x86\xdb\xcc\n:C\xf9\xfb\xd4\x9d\xd5<\xfd\x9a\xb3\xc1\xa3\xfck\x01J\x1c\xfbX\xd8BXM=h8K\xd9\x99p\xb8D,\x95\xb6\x7fl\xc8\x89W\x80\x9e\xb4\xc2\xc8\x00`\x92\xcc$6\x8f\xc9,\xa3-\xbbg9\x15\xfd\xdbY\xf7\x9c\x02\x8e\xf2\x1bu&a\xfa\xa7V>\x1b\x8dO\xb7\x17\x9e^\xa8+\xa2\xdc\xf6\x11\x94Q\n\x02mw\x0ebR\xe4\xdb\xd7n%\xcb\x9d\x8c\xcb\\\xbd\xa3Kd\xf3\x9cqoi&H2\xd0*\x05\xefn(/\x1a\x96=X\xf0\x1b\xa2}\xffHr\x9a\xa3]\xbf\xef\x02$\xd1\x0e+\xb8x\xfe\x1b\x97\xae\x02km{}\xf7]\'\x1a\xf6h\xadPv/q(\xd9P\xcf\x83\x0eD!4\x98\xf8\x97\x90\x06\x1eY\xfa\xb1\xbbep\xe8\t9\xa4\xee\xaeC\x15\xab\x1d\xb8\xa6\x16k/\x08\xb9g7\x94\x8br\xdf]t\x97\xea\xdc\xe9\x9b\xd1\\\x83\xe9!w\x15\xeb\x0b5\xd0\xccBjN\t\x1c\xbc#\x8c\x06\xfdj\xc9\x9a\x00\xfbd\xb6\xce\xb4\xea&\xd0i\x97\x1a\xfb\n\xf5\x94p\x98 \x983U`\xf7\xe6\nz\x16u\xa1ww\xa7O\\px\xd0\x18oa\xdc\x9c\xb7\xc2\xe7V\xa2\x89\xd0\xba:\xfa^\x9e:\xa83\xd5\xc4\xdf\xba\xc7Q\x0bs\x89y\x84P\x9b\xe54\x12\xa6\xdf\xc5k7E\x00\xfb\xc2L\xf6\xfa\xaa\x95\xfe\xa4\xfd\x98F\x12\xdb\x87\x936\x9b\xf1\xaaO\xd1L\x81\xc8\xcd]\xfd\xaa\xc2\x1d7\xf9\xd6\xd5\x0b\xf5\x12#\x05\xac.6\xaa\'v\xc1)\xebv\xc3\x82\xd4<\x03&\x04!~\x93\xb4\xb7\xea\xdd\xf3\xc1gc\xef\x8c\xe5\x15\t\t\x12\xb9\xc9f\xe8\x9f\x97k\xf1ka\x98\xef\x9d\xdb\x177\xde/\x9a`\x18V\xb0[:\xfc\xd4\xba\x12\xa4\x0e\xd3\x07\xc3\xc4\xd9p\xa7\x19\x15c\xc9\xa6\x98\xa1\xa9\r\x8a\xa3\x8cL\xc4\x85x\x03_\xff\x89+\xde|\xb4\x04\x04Bwy\xd3\r\xe0g\x14\x19\x9d\xef(\xe7D\x96\xfa_\xc0\xf0\x1d\xdaz`\x1c\'\xd2\xd3xz7<\xc8|[\x1e%\xc6\xd3+!k\x15\xc0}\xe4\xbc\xeaS\x8a\xcc#\xda\xff\x02\x9a\x97\xb7\x11\x92\xf1\x1fi\x1cVx[D\xaaU\xb6\xa9\x1c\x16Q\xb2~G.\xb8\xe4\x11WT\xa6rZ\x99b\xfd\xc0\x0046\x8f\xeaCi\xb4M\xac\x1d\x04\x1e\x14\xf6\x9f\x8a\xed`U\x97\xb8\xeb\xa7\x1a\xb5U\x14\x88m\xdd~\xdfL\xfe\xdegp{q\xaf\x92\xe4P\x1ff\x93\x07\xe2o\x1f8\xde\xac\xdd\xff\x97?S\xa9xv\xb6\xaf\x80\xabP\x1f\x95_b\x9a\xb6D\xe9-.\xe7x\xbe\xf3\x07\xd0m\xa1\x07e\xae\xeb\xb0\xc3+S\xf2AK\xe8!\xf4paE\x15\x07\x97i\xa3*\x0f\x03\xb7\xee\xbd\x03~\xc8\xbf\x135iP\xb4\xf0FZ:Z\x95\xf0f\xa1\x96\xdb\xb4\xcb\x92\x8c\xfa\xd1\x0fC\x0bm\x98\xa7c\xefMmM\x93\x8e\x95S\xe3\xb7v!\xde\xa57\xd0\xa2>]B\xec.\xb7\n\xaf7\xea\x16\xe8\x7f\x0b\t\xe0\xf8\xc30B\xdf/\xa5}\x9a\xd4\xce\xe5\xf1u\xfa..\x1e~K\xd7\xa8\xfa\xb38\xd5;\x93\x0cq\xe9\x97\xbfc1\xc0\xe5\xba\x00\x88=Bb\xa3\xf6\xb9\xe2\n\x15@]F\xce\xe6\x1dG\xd4\x0b\xe8L\x18\x9f,\xabN9\x02d\x19mu\\\x9e\x94\xb39{\xa4\xbc`9\xfb,\x91kq\x91\xe1\xfd:\x1c\x80\xe1\xf1\xdb\xdc+\x91\xbd\xec\xd3A\xaa\xac\x0f\x04k\xf2\xc1\xbd_z\xef\x07i\xc7\x97\xfaj\x9d\xc2G\x85\xac\xfc\xf6U\x80\x00h\x81b\x0b\xde%\xcea\x7f\x07\xc1^\x05\x99`\x93\xfeC\xba\x7f\x03\xbf\x92\x17om|\x1c\x83u\xba\xa5\x17\x84\xc0A\xf1\xd1\xff8r\r\xe1m\x9d\xa8@\xf9\xe7t\xcc\xc2oa\x12\xa0w\xa8V\xc2\x7f\xa7G\r\xff\xe9\x18X\xbd\x94\x85\x0b=\x92\x9c\x80\x85B\xa6\x9e#\x84\xb8\x91F\x9c\xcbi8\xe2\x90+)\xd2CR\xb4\x9b)\x07\xd5\xec\xe8\x1c2\xd0\xe4\x13\x18l\xc0~I:k\rM\x02\xae\x8d\xbf\xae\xa5\xcc\xcbX{\\\x86 \x90\x8f*@9~\x8f`S\x11\\O\xfd{;\x06\x17\xd1\x14\xa64\xa7\xeb\x0e$\x14\xd6\xfc!k\xaa\xb7~\xa7\xf1+\x84!\xa3,^\xa6\xeb\xfa]i\xec\x87\x82\x90\x16CF\xc1]\xc7@\xce\x7f#\x04\xfd)\x17\xef&\xddu\xe8\xbd\xbd\x1d\xb2\xf7\xc8`\x15\xbe\xa5Nm.\n\x91\xd0\xbd\xf8I\x87\xcb&\x08\x06s\xd9\xe5\xb2\xd6\xb9\x16\x97\xd048\x15!L\xa1\xfb\xd6`5f\xc80v@\xb1d\x97\x01(\xd3\xe1\x90\\\xfao\x84Y\xce\xb7s\xd6.\xcb\xa6E\xdf\x07\xb3\xd2\x00\r\x97\'g\xf6\xce1\xdd\x97\xba\x92x\xaa\xd1\xc2\xfa+\x1c\xaa\xcc\x85\xe9?\xe8_8\xd1\xc3V\xaf\x07M\x82\xbfA\xca\x9f kv\xf8h\x80\xde\x0c\x16\xa3\x9f\x83\xf5\xe9\xf0\xca]\x02\x12\xc3#\x16\x81\xce\x14\xa8*\xe6\xb9o\xfdx\xe8T\xca@\xc2\x08gSk\xdfK\xa3\xb1\x99\xfe\xb9\x17\xbe\xf6\xab\xf4\xa4\x9e\xaa\x93\x9595|\x82\xacd>\xb5\xd8nG\xe4%?\xe6\x03\xe8\x94q8\xf8\x9e\xed\t\xf7\x18\x08\x87\xdd<|\x80\xed\xb9\tOL\xab4\xf0s\xb2\xfa\x94c-T^\xebP\xeb\xae\xf3\xfa\xc0\x0e<q\xf5\x0c\x98\xd5Do\t\xb2(\xfc+|\xff*\xf8\xcfm%\\}(M\xd2\x9e\xf0\x18\x1b\x1c\xbf\x1f\x89\xe6\xf1\x00T\xa8\xe8\xbce\xe8\xbfJ\x838\xdbx\x94\x7f\xea>x\x1ed\x14UvK\x91\xa8\xef-\x01\x0c6e\x80\xd5\x1cUl.\xebA\x85\xbb:\x9f\xf9Pq\xab\xeb3\xe8\xc7\xe2{\xf2R\x9fL\x91\xbb1E\x8f\x15$\x06U\xa1\xd3\xf2\xea\x03\x98\\\x08-\x99\xe2\xdcsk\x10o\xc7\\\x06\x9cQ\x88\xc4\x821\xf8\xef"\x1eSud\xc7\xe7\x01\xa4\x81\x13\xdb\x9b\xd0tW\xbdb:n\x85\x18\xa7\xe7\xc1xt\xfd\x83[\'\xfb=\x114\xfc^\xc4\xc1\x9c\xb9\xfc\xd5\\_\xfb*PX\xa8\xa7\x86(\xa0\xa2\xfc\x1a\x04\xc6\xc4\x80\xcb;\x1a\x14\xb2\x16*\xf4\r\xcaU\'c\xaa\x10\xb6e>^?\xc9\xef\xde\x0fk\xc3\xbd{\xc2\x82;\x99\xc9\xbe\x97\xa2\x92 \xa4\xaf\'a\x8d[o\xcd15P\xeb\xca`{L\xd4FA\xec\xb6\x9c\xe7x\n[\xdc\xc7\n\x82\x82\x9c\x08=\xc5\x8e\xa2!\x98\xe9\x18,LY\xd4\xf8A,\xb2z\xd4\x13)\x1aH\x1a\xb0\xb8\xc5\xca\xc9\x19\xf8\xd3^L\xed\xa9\xc1a\x82\xa3U\x81\xdf\xbb\t\xc5\xfb<\xa3\xa3\x18\x16\x82A\xd2|Q\xeb\xb0j\xe6\xfbF1\xffp\x07\xe1\xf8+\x89\t\x9d\xaa!\x83\xa4K\xa4\\\xe6@\xa5\xfc\xb0\xc8\xde|\x02\x05\xb7\xa2\xd6\x82\x80\xaf\xf3/<1UtY\xe7O`\x97\xac=4\xbb\x02\xcd\xcdy\x92\xbaw\xa6\x9b\x8b\xbf\xd8\xbaYZ\xd1\xa1\xce\x01Ti.\xc01\xf6\xe6\xd9\xd6\x027\x17<%\x14\x06\xb7\n\xb1D\xf7\xdb$1V\xb3v\x109\x83?\xea\x19z\xc64\xf0g\xab\xee\xb4[\x02\r\xf1\x99$\x8a\xee.\xeb\x86\xb9\xd4\xfb\x84aV1\x80\x92\xbe\xd8hVdpd\xd0\xe1Y\xa0\xb7\xe4o\x18v\x90\xb1\xd9.M\x9f>\x89\xfdGd>]\xd9\xec\x16$\xbf;9\x03yD\x9d\x95\xb8qS~\x00\x96\xb7\xcd\x18K\xe7| \xad\xcf\xb6\xffu-\x8f\xba\x02\xca\xae\xfaq\x15\xa0\x83\xd4zA\xdaRds\xbfc%J/\x84?q\xf4\xf6\xb0u\t\x92\x89\xc3\xda~\xd0\xa6\xf3-\xb7M^\xa9\xbe\xe6\xcb\xa4\xacWdh8*J\xb66\xab;"\xfaeY\xe1\xad\x90+Z\xc3\x83\xeah\x89Z-\xda.\xe7\xe44\xa9\xa51!\x1eMZ$%\xd8\x82\x81\xaas-5\x05\xd4p\xae\xa0=\xd46K\rO\x7f\xf2\xdf\xcc\xa5\xb8\x98Z\xb4\x08\x9e\xe8\xf6\xf0k\xd2\x11\x18\n&\xb3\x19-\x1do\xb2\x90\xe7\x17!\xd9k\xb9P\x84\xa6\x9c\xbd\xf9\x19\xb2\xa5R\xe73\x837qk\x06\xfd\xd6\xabL\x05\xc7`r\xe3\xcc\xb3|\xe4\x96\xc8\xd3\x03\x19~A\xd9\xbaI\xdb1\xfa\x04\x82<\xb2h\x116\xb5\xb1\x96\x84\xb7\x16\xc3\xfd\xc3)T\x0f\x8a\xee\x9fS(\x01\'}\xb53\x00\xd5\x93G\x18\x8e\xb4%\x90\xc1\xbdN\xb4\xe8\xe7\xe8P\x87\xff\x16k\x10\xeb\xf4\x82\xd6_Z4\x15\xc7\xd2\xbfP}\xee\x94p:*\xd6>\x1f\xc6\xccP\x0c\xb6]\x1c\xfd99\xf9\x05\xd97(\x97\xbfQ\x15;W\x10x6"es]#\x88\xe6\xe4\xdb\x1c\xe84\x00d\x8a\xb3\\\xae\xcb\x10a\xe9\xd3l\x95\xa2l\xa9\xf9t\x174"\xdc\xe8\xca\x1b\xad\xcd\xfa\x92\x8a\x14lL\xba\x8f\xda\xa1\xff/\xc4\xb6oi!\x1e\xd6\xe2\xfb\xdcO\x19L\x04\\\x12g\xfd\xe7\xad\x92\xd0\x9bsX\xd7\x93\xdf\x0b\xcb\x94\xffO^\xe8\xde\xb3<\xb23\xd70(L\xd9\xa1\xb6\x0b/\xc7Xv\x1cN\xcex\xda\xe6"\x00\xca\xd5\xa7P\x99h\xfa\x18\x96\x8c\xc8VFT\xa1v\x08\xcd\xac\xcf0cM\x89"\x14\xabjS\x12]\xdc\x02\x05QC\x8b\xfd\xf5\x92blU\xa1\x0fa\xe8\x8f\x11\x0fzZ\xc6\xc7E\xf3\x99\x06\xf7E:_\xc6?\x03\xe1\x17\x91\x96\xbb\xdc\xf7\xbfJ\xf4\xbc\xd7\xbcy\x94\xb8\x16#\xbf\x01\x99z9\xaa\xd0\xe5\x8d\x19"\xce\xb2\xdb\xb4\xad/|~-\xf7I\xc3\xd7\xe1\x1f\xab\xbf@\xe1\x1eTT\x0ctV\xca\x89\xa4R@\x84\x02\x03p\xa6&\xf2AJp4jBmL\x84\x85\x0cI\xb0\xf9\xf8\x9f#\xfa>\xa6?p\xfd[\x03f\x19\r\xde\xcd~\xf2\x1dV\xe3\xb2UqF\xf3T\x14C\xcd\xb1J\x90\x83F\xb7\r\xad\xe5\xe9\x8d?\xbc\xf6Bu\xbd\xde?\xc0\x009\xb4\xe2\x82\xc3\x17\x03\xaf(\xbe\xd0-\xd5a\x9e\xe9\xa3\xd9\x19!\xab!>\xfa\x9d\x1f\x88\xee%\xb0\xed\xa5\xe0\xa2A\x92\xfb\x9e\xda\xc3C\xc6Z\xb7\xe3\x963:s\xfcS\x9a\x92\xb53u\xc8n\xd2\x85\xa2q\x8d\r\t%\x80|xt8\xc4@\xf9l\x0c\xdc\x0bB\x97\xe3\x86H\xa0\x8a\xa30\xd9j\x1a\'\x0b\xff|\xa5\xafS\xfd"2\x07~\xe5B.\x04\xe2vN\x83\x8d{\xc7U\x04(\xef\xa5\xae\xf6U\xd9\x9a\xf4\xe1\x17\xed\xdb\xab\xe2p\x85R.\xa2\xb6GNa\x14"\xf9\xa1\xcem\xc8D\xb9fb\xa8c\xccfy!\xdd<rV\xe1\xba\xceKW\x84\xf35q\x1dwA\xa9\xae\xea\xa4\x1c\xdd\xf5\x7f\xeb\xe0\x93\xd9\xc1\x1c\t\x1b\xa4\xc8Rn9\xd8T\xf8\xf8\xb0\x830\x8e\xbf\xca\x99&Q$\x9f\xae\xed\x96~\xdaI:%\xc3\xf0h3\x81\xcd\xa7V\x91\xf7\x1c\x90j\xd7Pf\x176\x88\x1b\xc9)\xca\'\xe8(\xca\x1a\xa7W\xf0}\xee\xa0\t\xd3{?\x01\x0f\x0f\x172\xd5\xf6\xc5W\x7f\x0b\x92\x8fp\x87|\xbe)\xec\x8bp7\xa5{\x95g\x05\xe3\twlQ\x071&\x04Rn\xf8\xe4\xe5$\tL\x9a\x06\xb14\x8fT\t\n[&\xb8\x8b\xdfa\x90\xdf\x9a\x7f\xdcj&\xe2#.\xcd:\x1d\xed\xd5m\x12^-\x04\x1c\x99\x07\x96\xfd\x90\xf9 YKS\x1e\x08|\xfb\xc7`\x1b\xaa\xa3n\xd4"\xbd\x13J\x9aB\xc2\x9d\xee\x189a\xd8\x9ax\xafd\x87\xcbu\x82\x98\xf6\xba\xf7\xfa\xa2=;b\x06E\xd6E\xe7\xd6\xeaD\\\xee\xc71\x10QV\x0f\x0f:\xdaoq\x1c\x0c\xf1\xd9\x90\x8c\xcd\xcd\x18\x06\xdd\x89\xb2\xe9\x8d\xc8\xb7b\xc5\x08\x88\x00/\xe4\x84\xb0\xe8\r \xa8\xbf\x92 \xf2\x94\xa3t\x19\x14^\xe4\x03\x06\xf5!VF\x15\x92\x95\x89\xd5S\xdc3T\xc6\xdd^\xc7\xb0\xffs\x0c*H\xcf\xa0D\xd0jx\xe42\xa5\xea}\xcb\x99\x05\xbdi[\xb8q(a\x10\xcd\x18\x9b\x15,\xd2\xe8@\xdfj^\x9e\xdc\xc4\xff\xfc\xa9.\xe3'))

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

minipy3-1.0.0.tar.gz (20.3 kB view hashes)

Uploaded Source

Built Distribution

minipy3-1.0.0-py3-none-any.whl (14.5 kB view hashes)

Uploaded Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page