{"id":18243795,"url":"https://github.com/d3cryptofc/structer","last_synced_at":"2026-01-28T07:31:18.466Z","repository":{"id":261179244,"uuid":"883351588","full_name":"d3cryptofc/structer","owner":"d3cryptofc","description":"🇺🇸 Structer is a structurer written in Python inspirated on C language structs. 📚","archived":false,"fork":false,"pushed_at":"2025-11-20T22:45:42.000Z","size":110,"stargazers_count":1,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-11-21T00:17:16.549Z","etag":null,"topics":["bandwidth","c","lightweight","memory","memory-allocation","memory-management","python","struct","structer","structured-data"],"latest_commit_sha":null,"homepage":"https://pypi.org/project/structer/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/d3cryptofc.png","metadata":{"files":{"readme":"README.PTBR.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-11-04T20:13:47.000Z","updated_at":"2025-11-20T22:45:46.000Z","dependencies_parsed_at":"2024-11-05T05:39:18.694Z","dependency_job_id":"a4026a7e-303c-4830-a609-bb88372098ad","html_url":"https://github.com/d3cryptofc/structer","commit_stats":{"total_commits":66,"total_committers":1,"mean_commits":66.0,"dds":0.0,"last_synced_commit":"769a492d9ad34ba59c6f2514b4c681730e6ea3f3"},"previous_names":["d3cryptofc/structer"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/d3cryptofc/structer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/d3cryptofc%2Fstructer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/d3cryptofc%2Fstructer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/d3cryptofc%2Fstructer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/d3cryptofc%2Fstructer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/d3cryptofc","download_url":"https://codeload.github.com/d3cryptofc/structer/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/d3cryptofc%2Fstructer/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28841987,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-28T05:50:12.573Z","status":"ssl_error","status_checked_at":"2026-01-28T05:49:54.528Z","response_time":57,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bandwidth","c","lightweight","memory","memory-allocation","memory-management","python","struct","structer","structured-data"],"created_at":"2024-11-05T09:03:13.162Z","updated_at":"2026-01-28T07:31:18.451Z","avatar_url":"https://github.com/d3cryptofc.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cbr\u003e\u003cbr\u003e\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://gist.githubusercontent.com/d3cryptofc/b137c0ecee656b142ec5265e2b4ec7bc/raw/3db96a47061d61b9db1d8e5b3e59723e328bf753/structer.svg\" width=\"500\"\u003e\n  \u003cbr\u003e\n  Crie structs similares de C em python de forma intutiva!\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://pypi.org/project/structer\"\u003e\u003cimg src=\"https://img.shields.io/badge/v0.3.0-282C34?style=flat-square\u0026label=Version\u0026labelColor=1D1D1D\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/d3cryptofc/structer/blob/main/CONTRIBUTING.md\"\u003e\u003cimg src=\"https://img.shields.io/badge/CONTRIBUTING-282C34?style=flat-square\u0026logo=git\u0026logoColor=FBFBFB\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/d3cryptofc/structer/blob/main/CODE_OF_CONDUCT.md\"\u003e\u003cimg src=\"https://img.shields.io/badge/CODE OF CONDUCT-282C34?style=flat-square\u0026logo=contributorcovenant\u0026logoColor=FBFBFB\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/d3cryptofc/structer/LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/badge/MIT-282C34?style=flat-square\u0026label=License\u0026labelColor=1D1D1D\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/d3cryptofc/structer/actions/workflows/ci.yml\"\u003e\u003cimg alt=\"GitHub Actions Workflow Status\" src=\"https://img.shields.io/github/actions/workflow/status/d3cryptofc/structer/ci.yml?style=flat-square\u0026labelColor=1D1D1D\u0026label=Python 3.9 | 3.10 | 3.11 | 3.12\u0026logo=python\u0026logoColor=white\u0026color=282C34\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\u003cbr\u003e\n\n### 📌 Sumário\n\n- [Instalação](#%EF%B8%8F-instala%C3%A7%C3%A3o)\n- [Começando](#%EF%B8%8F-come%C3%A7ando)\n  - [Criando seu primeiro modelo de struct](#1-criando-seu-primeiro-modelo-de-struct)\n  - [Geração de instância e armazenamento de dados](#2-gera%C3%A7%C3%A3o-de-inst%C3%A2ncia-e-armazenamento-de-dados)\n  - [Representação e tamanho](#3-representa%C3%A7%C3%A3o-e-tamanho)\n  - [Obtendo os dados serializados](#4-obtendo-os-dados-serializados)\n- [Perguntas Frequentes (FAQ)](#-perguntas-frequentes-faq)\n  - [O que são structs?](#1-o-que-são-structs)\n  - [Por que usar structs em Python?](#2-por-que-usar-structs-em-python)\n\n### 🛠️ Instalação\n\nInstalação via PyPI:\n```\npip3 install structer\n```\n\nInstalação via GitHub:\n```\npip3 install git+https://github.com/d3cryptofc/structer.git\n```\n\n### 🏃‍♀️ Começando\n\nTe garanto que é mais fácil do que parece.\n\n#### 1. Criando seu primeiro modelo de struct\n\nCrie seu modelo de struct usando `structer.structfy(name, fields)`:\n\n```python3\nfrom structer import structfy, Char, Str, Field\n\nPerson = structfy('Person', [\n  Field('name', Str(15)),\n  Field('gender', Char())\n])\n```\n\nNotas:\n\n- `structer.Str` é um apelido curto para `structer.String`.\n- `structer.Char` é como `structer.String(1)`, porém **especializado** para isso.\n\n#### 2. Geração de instância e armazenamento de dados\n\nVocê pode criar uma instância passando os valores como argumento:\n\n```python\n\u003e\u003e\u003e p = Person(name='John', gender='M')\n\u003e\u003e\u003e p\nPerson(name(15)='John', gender(1)='M') -\u003e 16\n```\n\nOu, talvez queira fazer as modificações de forma individual com a instância já criada:\n\n```python\n\u003e\u003e\u003e p = Person()\n\u003e\u003e\u003e p\nPerson(name(15)='', gender(1)='') -\u003e 16\n\u003e\u003e\u003e p.name = 'John'\n\u003e\u003e\u003e p.gender = 'M'\n\u003e\u003e\u003e p\nPerson(name(15)='John', gender(1)='M') -\u003e 16\n```\n\n#### 3. Representação e tamanho\n\nVocê deve ter notado que a representação do objeto mostra o tamanho de cada campo e o tamanho total de todos os campos.\n\nPara saber o tamanho total de sua instância, use a função `len`:\n\n```python\n\u003e\u003e\u003e len(p)\n16\n```\n\nTalvez queira saber o tamanho total do modelo de struct sem precisar criar uma instância, acesse o atributo `__struct_size__` (tamanho dado em bytes):\n\n```python\n\u003e\u003e\u003e Person.__struct_size__\n16\n```\n\n#### 4. Obtendo os dados serializados\n\nBasta acessar o atributo `__struct_binary__`:\n\n```python\n\u003e\u003e\u003e p.__struct_binary__\nb'John\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00M'\n```\n\nPronto! Agora você faz o que bem quiser com isso.\n\n### 💬 Perguntas Frequentes (FAQ)\n\n#### 1. O que são structs?\n\nSe você nunca programou em C, pode inicialmente pensar que uma struct é similar a um [dataclass](https://docs.python.org/3/library/dataclasses.html), mas diferente de um dataclass, structs mapeiam os campos na memória, de forma que você tenha todos os dados colados um no outro porém delimitados por seus tamanhos.\n\nVocê pode imaginar que internamente o mapeamento é feito como:\n\n```python3\n# Your field sizes.\nf_first_name = 10\nf_gender = 1\nf_age = 2\n\n# Memory containing the data.\nmemory = 'John      M23'\n\n# Accessing data delimited by its field sizes.\nmemory[0:f_first_name] # 'John      '\nmemory[f_first_name:f_first_name + f_gender] # 'M'\nmemory[f_first_name + f_gender:f_first_name + f_gender + f_age] # '23'\n```\n\nPorém uma struct abstrai isso, de forma que o uso seja estupidamente simples:\n\n```python3\nperson.first_name = 'John'\nperson.gender = 'M'\nperson.age = 23\n```\n\nÉ importante dizer que o primeiro exemplo é bem grosseiro, structs utilizam bytes ao invés de string, permitindo que você economize um espaço absurdo.\n\nPor exemplo, em `idade` do exemplo acima foi inserido `'23'` como string, o que consome 2 bytes na memória, porém poderiamos representar números de 0 a 255 (00 a FF) usando um único byte.\n\nOu melhor, imagine que você queira armazenar o número `18,000,000,000,000,000,000` (18 quintilhões) na memória, no entanto armazenar num arquivo de texto como uma string iria consumir 20 bytes, sendo que bastaria 8 bytes para representar o número.\n\nO desperdício desses 12 bytes daria pra representar o próprio número duas vezes, tanto que isso em larga escala jogaria um enorme espaço de armazenamento no lixo, cerca de 60% de espaço poderia ser economizado, isso seria ir de 1TB para somente 400G.\n\n#### 2. Por que usar structs em Python?\n\nStructs são como modelos para mapear o espaço na memória e organizar os dados, e, diferente de C (por ser compilado), em python cada instância que for criada vai consumir espaço na memória RAM, assim como qualquer outra instância de classe do Python.\n\nO ponto não é usar structs pensando que será uma alternativa mais leve que dataclass tanto quanto uma struct de verdade (eu não faço milagres), o ponto está justamente no mapeamento de memória feita pela struct, ela organizará todos os dados em binário, e da forma como você definiu que ela organizasse, para que você possa acessar quando bem quiser, seja para:\n\n1. Economia de espaço em arquivo.\n2. Economia de banda na transmissão de dados.\n3. Desserializar dados oriundos de structs de verdade de um protocolo de rede.\n4. Criação de layouts binários em geral, até mesmo de um arquivo PNG.\n\nOu para qualquer outro caso onde também seja útil.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fd3cryptofc%2Fstructer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fd3cryptofc%2Fstructer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fd3cryptofc%2Fstructer/lists"}