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 details)

Uploaded Source

Built Distribution

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

Uploaded Python 3

File details

Details for the file minipy3-1.0.0.tar.gz.

File metadata

  • Download URL: minipy3-1.0.0.tar.gz
  • Upload date:
  • Size: 20.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.11.0b4

File hashes

Hashes for minipy3-1.0.0.tar.gz
Algorithm Hash digest
SHA256 d32a7310a4b64ef062e5a41dd07abce6ae65efe9c8b3c22492790fafbfb2f6a2
MD5 79143d5760250e94f8aa7dbb31437686
BLAKE2b-256 eb7b7e9856c9ec2c16c5fda33e45841c8f83505d0ca91101d03b902607bb690c

See more details on using hashes here.

File details

Details for the file minipy3-1.0.0-py3-none-any.whl.

File metadata

  • Download URL: minipy3-1.0.0-py3-none-any.whl
  • Upload date:
  • Size: 14.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.11.0b4

File hashes

Hashes for minipy3-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 9caff2e69c64fb0fee212eac01df074e86d100b503aefac86f9e4b9376fee720
MD5 e941020d24213c30168f496786b70c24
BLAKE2b-256 f450ed30b012ff2d22b28a14c0b19529e5ab87ff88075f31b30a2a9d3e5240f8

See more details on using hashes here.

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