portugython 0.1.0__tar.gz → 0.3.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- portugython-0.3.0/CHANGELOG.md +91 -0
- {portugython-0.1.0 → portugython-0.3.0}/PKG-INFO +1 -1
- {portugython-0.1.0 → portugython-0.3.0}/portugython/__init__.py +16 -3
- portugython-0.3.0/portugython/_importador.py +136 -0
- portugython-0.3.0/portugython/abstrato.py +14 -0
- portugython-0.3.0/portugython/argumentos.py +44 -0
- portugython-0.3.0/portugython/assincronico.py +87 -0
- portugython-0.3.0/portugython/bisecao.py +106 -0
- portugython-0.3.0/portugython/calendario.py +70 -0
- portugython-0.3.0/portugython/caminho.py +132 -0
- portugython-0.3.0/portugython/classe_dados.py +40 -0
- portugython-0.3.0/portugython/codificacao.py +95 -0
- portugython-0.3.0/portugython/compressao.py +58 -0
- portugython-0.3.0/portugython/configuracao.py +70 -0
- portugython-0.3.0/portugython/contexto.py +21 -0
- portugython-0.3.0/portugython/copia.py +28 -0
- portugython-0.3.0/portugython/csv_pt.py +46 -0
- portugython-0.3.0/portugython/depuracao.py +122 -0
- portugython-0.3.0/portugython/enumeracao.py +17 -0
- portugython-0.3.0/portugython/estatistica.py +81 -0
- portugython-0.3.0/portugython/estrutura.py +73 -0
- portugython-0.3.0/portugython/formatacao.py +118 -0
- portugython-0.3.0/portugython/hash_pt.py +96 -0
- portugython-0.3.0/portugython/identificador.py +45 -0
- portugython-0.3.0/portugython/json.py +71 -0
- portugython-0.3.0/portugython/rede.py +129 -0
- portugython-0.3.0/portugython/registro.py +64 -0
- portugython-0.3.0/portugython/serializacao.py +55 -0
- portugython-0.3.0/portugython/soquete.py +75 -0
- portugython-0.3.0/portugython/subprocesso.py +91 -0
- portugython-0.3.0/portugython/threads.py +110 -0
- portugython-0.3.0/portugython/tipagem.py +83 -0
- {portugython-0.1.0 → portugython-0.3.0}/pyproject.toml +1 -1
- portugython-0.3.0/tests/test_importador.py +170 -0
- {portugython-0.1.0 → portugython-0.3.0}/tests/test_portugython.py +1 -1
- portugython-0.3.0/tests/test_submodulos.py +433 -0
- portugython-0.1.0/CHANGELOG.md +0 -31
- portugython-0.1.0/tests/test_submodulos.py +0 -217
- {portugython-0.1.0 → portugython-0.3.0}/.gitignore +0 -0
- {portugython-0.1.0 → portugython-0.3.0}/LICENSE +0 -0
- {portugython-0.1.0 → portugython-0.3.0}/README.md +0 -0
- {portugython-0.1.0 → portugython-0.3.0}/portugython/aleatorio.py +0 -0
- {portugython-0.1.0 → portugython-0.3.0}/portugython/colecoes.py +0 -0
- {portugython-0.1.0 → portugython-0.3.0}/portugython/expressao.py +0 -0
- {portugython-0.1.0 → portugython-0.3.0}/portugython/funcional.py +0 -0
- {portugython-0.1.0 → portugython-0.3.0}/portugython/iteradores.py +0 -0
- {portugython-0.1.0 → portugython-0.3.0}/portugython/matematica.py +0 -0
- {portugython-0.1.0 → portugython-0.3.0}/portugython/py.typed +0 -0
- {portugython-0.1.0 → portugython-0.3.0}/portugython/sistema.py +0 -0
- {portugython-0.1.0 → portugython-0.3.0}/portugython/tempo.py +0 -0
- {portugython-0.1.0 → portugython-0.3.0}/tests/__init__.py +0 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 0.3.0 (2026-06-26)
|
|
4
|
+
|
|
5
|
+
Add import hook so all Portuguese module names work as top-level imports.
|
|
6
|
+
|
|
7
|
+
After `import portugython`, the full stdlib-level syntax works:
|
|
8
|
+
|
|
9
|
+
import aleatorio
|
|
10
|
+
from matematica import raiz_quadrada, PI
|
|
11
|
+
from colecoes import Contador, Pilha, Fila
|
|
12
|
+
from tempo import agora, hoje
|
|
13
|
+
from expressao import buscar, encontrar_todos
|
|
14
|
+
from dados import serializar, deserializar # json
|
|
15
|
+
from subprocesso import executar
|
|
16
|
+
from caminho import Caminho
|
|
17
|
+
# ... all 36 modules
|
|
18
|
+
|
|
19
|
+
New exports:
|
|
20
|
+
- `portugython.instalar()` - instala o gancho (chamado automaticamente)
|
|
21
|
+
- `portugython.desinstalar()` - remove o gancho
|
|
22
|
+
- `portugython.listar_modulos()` - retorna o mapa de nomes
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
Full stdlib coverage. 36 submodules total, all importable via `from portugython import <modulo>`:
|
|
27
|
+
|
|
28
|
+
**New in 0.2.0:**
|
|
29
|
+
- `caminho` (pathlib): Caminho com existe, eh_arquivo, listar, ler_texto, escrever_texto, etc.
|
|
30
|
+
- `json`: serializar, deserializar, serializar_arquivo, deserializar_arquivo
|
|
31
|
+
- `estatistica` (statistics): media, mediana, moda, desvio_padrao, covariancia, correlacao, quantis
|
|
32
|
+
- `enumeracao` (enum): Enumeracao, EnumeracaoInteira, EnumeracaoBandeira, automatico, unico
|
|
33
|
+
- `classe_dados` (dataclasses): classe_dados, campo, para_dicionario, para_tupla, substituir
|
|
34
|
+
- `contexto` (contextlib): gerenciador, suprimir, fechar_ao_sair, pilha_saida
|
|
35
|
+
- `tipagem` (typing): re-exporta todos os tipos com nomes em Portugues
|
|
36
|
+
- `csv_pt` (csv): ler_csv, escrever_csv, LeitorCSV, EscritorCSV, LeitorDicionario
|
|
37
|
+
- `registro` (logging): obter_registrador, configurar_registro, depurar, informar, avisar, erro
|
|
38
|
+
- `argumentos` (argparse): AnalisadorArgumentos com adicionar_argumento, analisar
|
|
39
|
+
- `subprocesso` (subprocess): executar, executar_shell, saida, chamar
|
|
40
|
+
- `copia` (copy): copiar, copiar_profundo
|
|
41
|
+
- `hash_pt` (hashlib + hmac): md5, sha256, sha512, blake2b, codigo_autenticacao, comparar_seguro
|
|
42
|
+
- `threads` (threading): Thread, Semaforo, Evento, Trava, contagem_threads, thread_atual
|
|
43
|
+
- `abstrato` (abc): ClasseAbstrata, metodo_abstrato, propriedade_abstrata
|
|
44
|
+
- `bisecao` (bisect + heapq): inserir_ordenado, buscar_ordenado, heapificar, empurrar, n_maiores
|
|
45
|
+
- `identificador` (uuid): uuid1, uuid3, uuid4, uuid5
|
|
46
|
+
- `calendario` (calendar): dias_no_mes, eh_ano_bissexto, dia_semana, calendario_mes
|
|
47
|
+
- `configuracao` (configparser): AnalisadorConfig com ler_arquivo, obter, definir, escrever_arquivo
|
|
48
|
+
- `serializacao` (pickle): serializar, deserializar, serializar_arquivo, deserializar_arquivo
|
|
49
|
+
- `codificacao` (base64 + codecs): para_base64, de_base64, para_base32, para_base16
|
|
50
|
+
- `compressao` (gzip + zlib): comprimir_gzip, descomprimir_gzip, comprimir_zlib
|
|
51
|
+
- `formatacao` (textwrap + pprint + string): quebrar, preencher, dedenter, recuar, imprimir_bonito
|
|
52
|
+
- `depuracao` (traceback + warnings + gc): imprimir_excecao, formatar_excecao, coletar_lixo
|
|
53
|
+
- `soquete` (socket): Soquete, criar_conexao, criar_servidor, nome_host, endereco_ip
|
|
54
|
+
- `assincronico` (asyncio): executar, criar_tarefa, dormir, reunir, Evento, Fila
|
|
55
|
+
- `estrutura` (struct): empacotar, desempacotar, calcular_tamanho
|
|
56
|
+
- `rede` (urllib + http): baixar_url, abrir_url, analisar_url, codificar_url, codificar_parametros
|
|
57
|
+
|
|
58
|
+
Also in 0.2.0:
|
|
59
|
+
- Fix: renamed builtin `identificador` alias to `obter_id` to avoid shadowing the uuid submodule
|
|
60
|
+
- 49 tests covering all modules
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
## 0.1.0 (2026-06-26)
|
|
64
|
+
|
|
65
|
+
- Add full stdlib submodule set with Portuguese translations:
|
|
66
|
+
- `aleatorio` (random): escolha, embaralhe, amostra, gauss, normal, etc.
|
|
67
|
+
- `matematica` (math): raiz_quadrada, seno, cosseno, fatorial, mdc, mmc, etc.
|
|
68
|
+
- `sistema` (os + sys): diretorio_atual, listar_diretorio, existe, sair, etc.
|
|
69
|
+
- `tempo` (time + datetime): Data, Hora, DataHora, Duracao, agora, hoje, dormir, etc.
|
|
70
|
+
- `colecoes` (collections): Contador, Deque, DicionarioOrdenado, Pilha, Fila, etc.
|
|
71
|
+
- `iteradores` (itertools): encadeie, combine, permute, acumule, agrupe, etc.
|
|
72
|
+
- `funcional` (functools): reduzido, parcial, cache, compor, negado, etc.
|
|
73
|
+
- `expressao` (re): compilar, buscar, substituir, encontrar_todos, Padrao, etc.
|
|
74
|
+
- Rewrite `__init__.py` with clean Portuguese names (remove `_pt` suffixes)
|
|
75
|
+
- Add `Conjunto` class with Portuguese methods
|
|
76
|
+
- Expand `Texto`, `Lista`, `Dicionario` with more methods
|
|
77
|
+
- Add more exception types: ErroArquivo, ErroPermissao, ErroRecursao, ErroPausa
|
|
78
|
+
- Bump minimum Python to >=3.10
|
|
79
|
+
- 30 tests across all modules
|
|
80
|
+
|
|
81
|
+
## 0.0.15 (2026-06-26)
|
|
82
|
+
|
|
83
|
+
- Add Portuguese translations of Python builtins and core functions
|
|
84
|
+
- Introduce Lista, Dicionario, Texto classes with Portuguese methods
|
|
85
|
+
- Add helper functions: se(), para_cada(), filtro()
|
|
86
|
+
- Add Portuguese exception classes
|
|
87
|
+
- Expand test suite
|
|
88
|
+
|
|
89
|
+
## 0.0.14 (2022-11-28)
|
|
90
|
+
|
|
91
|
+
- Latest release on PyPI.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: portugython
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.3.0
|
|
4
4
|
Summary: A Portuguese translation of the Python functions/modules/packages
|
|
5
5
|
Project-URL: Homepage, https://github.com/spacemany2k38/portugython
|
|
6
6
|
Project-URL: Bug Tracker, https://github.com/spacemany2k38/portugython/issues
|
|
@@ -4,7 +4,16 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
from functools import reduce as _reduce
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
from portugython._importador import (
|
|
8
|
+
desinstalar,
|
|
9
|
+
instalar,
|
|
10
|
+
listar_modulos,
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
__version__ = "0.3.0"
|
|
14
|
+
|
|
15
|
+
# Instala o gancho de importacao automaticamente
|
|
16
|
+
instalar()
|
|
8
17
|
|
|
9
18
|
# ---------------------------------------------------------------------------
|
|
10
19
|
# IO
|
|
@@ -48,7 +57,7 @@ tipo = type
|
|
|
48
57
|
chamavel = callable
|
|
49
58
|
e_instancia = isinstance
|
|
50
59
|
e_subclasse = issubclass
|
|
51
|
-
|
|
60
|
+
obter_id = id
|
|
52
61
|
atributos = dir
|
|
53
62
|
obter_atributo = getattr
|
|
54
63
|
definir_atributo = setattr
|
|
@@ -490,6 +499,10 @@ def imprima(*args: object, sep: str = " ", fim: str = "\n", **kwargs: object) ->
|
|
|
490
499
|
# ---------------------------------------------------------------------------
|
|
491
500
|
__all__ = [
|
|
492
501
|
"__version__",
|
|
502
|
+
# Importador
|
|
503
|
+
"instalar",
|
|
504
|
+
"desinstalar",
|
|
505
|
+
"listar_modulos",
|
|
493
506
|
# IO
|
|
494
507
|
"escreva",
|
|
495
508
|
"leia",
|
|
@@ -522,7 +535,7 @@ __all__ = [
|
|
|
522
535
|
"chamavel",
|
|
523
536
|
"e_instancia",
|
|
524
537
|
"e_subclasse",
|
|
525
|
-
"
|
|
538
|
+
"obter_id",
|
|
526
539
|
"atributos",
|
|
527
540
|
"obter_atributo",
|
|
528
541
|
"definir_atributo",
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"""_importador - gancho de importacao que permite importar modulos em Portugues.
|
|
2
|
+
|
|
3
|
+
Quando ativado, permite usar nomes de modulos em Portugues diretamente:
|
|
4
|
+
|
|
5
|
+
import aleatorio
|
|
6
|
+
from matematica import raiz_quadrada
|
|
7
|
+
from colecoes import Contador
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
import importlib
|
|
13
|
+
import importlib.abc
|
|
14
|
+
import importlib.machinery
|
|
15
|
+
import sys
|
|
16
|
+
from importlib.machinery import ModuleSpec
|
|
17
|
+
from typing import Sequence
|
|
18
|
+
|
|
19
|
+
# Mapeamento de nome em Portugues -> caminho completo do modulo portugython
|
|
20
|
+
MAPA_MODULOS: dict[str, str] = {
|
|
21
|
+
# Matematica e ciencia
|
|
22
|
+
"aleatorio": "portugython.aleatorio",
|
|
23
|
+
"matematica": "portugython.matematica",
|
|
24
|
+
"estatistica": "portugython.estatistica",
|
|
25
|
+
# Tipos e estruturas
|
|
26
|
+
"colecoes": "portugython.colecoes",
|
|
27
|
+
"iteradores": "portugython.iteradores",
|
|
28
|
+
"funcional": "portugython.funcional",
|
|
29
|
+
"bisecao": "portugython.bisecao",
|
|
30
|
+
# Tempo e data
|
|
31
|
+
"tempo": "portugython.tempo",
|
|
32
|
+
"calendario": "portugython.calendario",
|
|
33
|
+
# Sistema e IO
|
|
34
|
+
"sistema": "portugython.sistema",
|
|
35
|
+
"caminho": "portugython.caminho",
|
|
36
|
+
"subprocesso": "portugython.subprocesso",
|
|
37
|
+
"soquete": "portugython.soquete",
|
|
38
|
+
"rede": "portugython.rede",
|
|
39
|
+
# Texto e expressoes
|
|
40
|
+
"expressao": "portugython.expressao",
|
|
41
|
+
"formatacao": "portugython.formatacao",
|
|
42
|
+
# Serialization e codificacao
|
|
43
|
+
"serializacao": "portugython.serializacao",
|
|
44
|
+
"codificacao": "portugython.codificacao",
|
|
45
|
+
"compressao": "portugython.compressao",
|
|
46
|
+
"dados": "portugython.json",
|
|
47
|
+
# Concorrencia
|
|
48
|
+
"threads": "portugython.threads",
|
|
49
|
+
"assincronico": "portugython.assincronico",
|
|
50
|
+
# OOP e tipos
|
|
51
|
+
"abstrato": "portugython.abstrato",
|
|
52
|
+
"enumeracao": "portugython.enumeracao",
|
|
53
|
+
"classe_dados": "portugython.classe_dados",
|
|
54
|
+
"tipagem": "portugython.tipagem",
|
|
55
|
+
# Utilitarios
|
|
56
|
+
"registro": "portugython.registro",
|
|
57
|
+
"argumentos": "portugython.argumentos",
|
|
58
|
+
"contexto": "portugython.contexto",
|
|
59
|
+
"copia": "portugython.copia",
|
|
60
|
+
"hash_pt": "portugython.hash_pt",
|
|
61
|
+
"identificador": "portugython.identificador",
|
|
62
|
+
"configuracao": "portugython.configuracao",
|
|
63
|
+
"estrutura": "portugython.estrutura",
|
|
64
|
+
"depuracao": "portugython.depuracao",
|
|
65
|
+
"csv_pt": "portugython.csv_pt",
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
class _CarregadorAlias(importlib.abc.Loader):
|
|
70
|
+
"""Carrega um modulo portugython sob um nome em Portugues."""
|
|
71
|
+
|
|
72
|
+
def __init__(self, modulo_real: str) -> None:
|
|
73
|
+
self._modulo_real = modulo_real
|
|
74
|
+
|
|
75
|
+
def create_module(self, spec: ModuleSpec): # noqa: ANN001
|
|
76
|
+
"""Retorna o modulo real (ja carregado ou carregado agora)."""
|
|
77
|
+
return importlib.import_module(self._modulo_real)
|
|
78
|
+
|
|
79
|
+
def exec_module(self, module) -> None: # noqa: ANN001
|
|
80
|
+
"""Nao precisa fazer nada: create_module ja retornou o modulo pronto."""
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
class ImportadorPortugues(importlib.abc.MetaPathFinder):
|
|
84
|
+
"""Intercepta imports de nomes em Portugues e redireciona para portugython.*."""
|
|
85
|
+
|
|
86
|
+
def find_spec(
|
|
87
|
+
self,
|
|
88
|
+
fullname: str,
|
|
89
|
+
path: Sequence[str] | None,
|
|
90
|
+
target=None, # noqa: ANN001
|
|
91
|
+
) -> ModuleSpec | None:
|
|
92
|
+
"""Retorna um ModuleSpec para o modulo em Portugues, se mapeado.
|
|
93
|
+
|
|
94
|
+
Args:
|
|
95
|
+
fullname: Nome completo do modulo sendo importado.
|
|
96
|
+
path: Caminho de busca (ignorado aqui).
|
|
97
|
+
target: Modulo alvo (ignorado aqui).
|
|
98
|
+
"""
|
|
99
|
+
if fullname in MAPA_MODULOS:
|
|
100
|
+
modulo_real = MAPA_MODULOS[fullname]
|
|
101
|
+
carregador = _CarregadorAlias(modulo_real)
|
|
102
|
+
return ModuleSpec(fullname, carregador)
|
|
103
|
+
return None
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
_gancho = ImportadorPortugues()
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def instalar() -> None:
|
|
110
|
+
"""Instala o importador de modulos em Portugues no sys.meta_path.
|
|
111
|
+
|
|
112
|
+
Apos chamar esta funcao, e possivel importar modulos pelo nome em Portugues:
|
|
113
|
+
|
|
114
|
+
import aleatorio
|
|
115
|
+
from matematica import raiz_quadrada, PI
|
|
116
|
+
from colecoes import Contador, Pilha
|
|
117
|
+
from tempo import agora, hoje
|
|
118
|
+
"""
|
|
119
|
+
if not any(isinstance(f, ImportadorPortugues) for f in sys.meta_path):
|
|
120
|
+
sys.meta_path.insert(0, _gancho)
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def desinstalar() -> None:
|
|
124
|
+
"""Remove o importador de modulos em Portugues do sys.meta_path."""
|
|
125
|
+
sys.meta_path[:] = [
|
|
126
|
+
f for f in sys.meta_path if not isinstance(f, ImportadorPortugues)
|
|
127
|
+
]
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def listar_modulos() -> dict[str, str]:
|
|
131
|
+
"""Retorna o mapeamento de nomes em Portugues para modulos portugython.
|
|
132
|
+
|
|
133
|
+
Returns:
|
|
134
|
+
Dicionario com nome_portugues -> caminho_modulo.
|
|
135
|
+
"""
|
|
136
|
+
return dict(MAPA_MODULOS)
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"""abstrato - traducao em Portugues do modulo abc."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
import abc as _abc
|
|
5
|
+
|
|
6
|
+
__all__ = ["ClasseAbstrata", "metodo_abstrato", "propriedade_abstrata", "ABCMeta"]
|
|
7
|
+
|
|
8
|
+
ClasseAbstrata = _abc.ABC
|
|
9
|
+
metodo_abstrato = _abc.abstractmethod
|
|
10
|
+
ABCMeta = _abc.ABCMeta
|
|
11
|
+
|
|
12
|
+
def propriedade_abstrata(func):
|
|
13
|
+
"""Decorator para propriedades abstratas."""
|
|
14
|
+
return property(_abc.abstractmethod(func))
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"""argumentos - traducao em Portugues do modulo argparse."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
import argparse as _ap
|
|
5
|
+
|
|
6
|
+
__all__ = [
|
|
7
|
+
"AnalisadorArgumentos", "EspacoNomes", "AcaoAdicionar",
|
|
8
|
+
"AcaoVerdadeiro", "AcaoFalso", "AcaoContar",
|
|
9
|
+
"ErroArgumento",
|
|
10
|
+
]
|
|
11
|
+
|
|
12
|
+
ErroArgumento = _ap.ArgumentError
|
|
13
|
+
EspacoNomes = _ap.Namespace
|
|
14
|
+
AcaoAdicionar = "append"
|
|
15
|
+
AcaoVerdadeiro = "store_true"
|
|
16
|
+
AcaoFalso = "store_false"
|
|
17
|
+
AcaoContar = "count"
|
|
18
|
+
|
|
19
|
+
class AnalisadorArgumentos(_ap.ArgumentParser):
|
|
20
|
+
"""ArgumentParser com metodos em Portugues."""
|
|
21
|
+
|
|
22
|
+
def adicionar_argumento(self, *nomes, **kwargs) -> None:
|
|
23
|
+
"""Adiciona um argumento ao analisador."""
|
|
24
|
+
self.add_argument(*nomes, **kwargs)
|
|
25
|
+
|
|
26
|
+
def analisar(self, args=None) -> _ap.Namespace:
|
|
27
|
+
"""Analisa os argumentos da linha de comando."""
|
|
28
|
+
return self.parse_args(args)
|
|
29
|
+
|
|
30
|
+
def analisar_parcial(self, args=None) -> tuple:
|
|
31
|
+
"""Analisa os argumentos conhecidos, ignorando os desconhecidos."""
|
|
32
|
+
return self.parse_known_args(args)
|
|
33
|
+
|
|
34
|
+
def adicionar_subcomandos(self, **kwargs) -> _ap.Action:
|
|
35
|
+
"""Adiciona suporte a subcomandos."""
|
|
36
|
+
return self.add_subparsers(**kwargs)
|
|
37
|
+
|
|
38
|
+
def adicionar_grupo(self, titulo: str = "", descricao: str = ""):
|
|
39
|
+
"""Adiciona um grupo de argumentos."""
|
|
40
|
+
return self.add_argument_group(titulo, descricao)
|
|
41
|
+
|
|
42
|
+
def adicionar_grupo_exclusivo(self, obrigatorio: bool = False):
|
|
43
|
+
"""Adiciona um grupo mutualmente exclusivo."""
|
|
44
|
+
return self.add_mutually_exclusive_group(required=obrigatorio)
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"""assincronico - traducao em Portugues do modulo asyncio."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
import asyncio as _aio
|
|
5
|
+
from typing import Any, Coroutine
|
|
6
|
+
|
|
7
|
+
__all__ = [
|
|
8
|
+
"executar", "esperar", "criar_tarefa", "dormir",
|
|
9
|
+
"reunir", "timeout", "cancelar_ao_timeout",
|
|
10
|
+
"Evento", "Fila", "Semaforo", "Trava",
|
|
11
|
+
"obter_laco", "novo_laco", "LacoEventos",
|
|
12
|
+
"corrotina", "eh_corrotina", "eh_aguardavel",
|
|
13
|
+
]
|
|
14
|
+
|
|
15
|
+
LacoEventos = _aio.AbstractEventLoop
|
|
16
|
+
Evento = _aio.Event
|
|
17
|
+
Fila = _aio.Queue
|
|
18
|
+
Semaforo = _aio.Semaphore
|
|
19
|
+
Trava = _aio.Lock
|
|
20
|
+
corrotina = _aio.coroutine if hasattr(_aio, "coroutine") else None
|
|
21
|
+
|
|
22
|
+
def executar(corrotina_principal: Coroutine, *, depurar: bool = False) -> Any:
|
|
23
|
+
"""Executa uma corrotina como programa principal.
|
|
24
|
+
|
|
25
|
+
Args:
|
|
26
|
+
corrotina_principal: Corrotina a executar.
|
|
27
|
+
depurar: Habilita modo de depuracao.
|
|
28
|
+
"""
|
|
29
|
+
return _aio.run(corrotina_principal, debug=depurar)
|
|
30
|
+
|
|
31
|
+
async def esperar(aguardavel: Any) -> Any:
|
|
32
|
+
"""Aguarda um aguardavel e retorna o resultado.
|
|
33
|
+
|
|
34
|
+
Args:
|
|
35
|
+
aguardavel: Corrotina, Task ou Future a aguardar.
|
|
36
|
+
"""
|
|
37
|
+
return await _aio.ensure_future(aguardavel)
|
|
38
|
+
|
|
39
|
+
def criar_tarefa(corrotina: Coroutine, *, nome: str | None = None) -> _aio.Task:
|
|
40
|
+
"""Cria uma Task a partir de uma corrotina.
|
|
41
|
+
|
|
42
|
+
Args:
|
|
43
|
+
corrotina: Corrotina a executar como tarefa.
|
|
44
|
+
nome: Nome opcional da tarefa.
|
|
45
|
+
"""
|
|
46
|
+
return _aio.create_task(corrotina, name=nome)
|
|
47
|
+
|
|
48
|
+
async def dormir(segundos: float) -> None:
|
|
49
|
+
"""Suspende a corrotina pelo tempo especificado.
|
|
50
|
+
|
|
51
|
+
Args:
|
|
52
|
+
segundos: Tempo de espera em segundos.
|
|
53
|
+
"""
|
|
54
|
+
await _aio.sleep(segundos)
|
|
55
|
+
|
|
56
|
+
async def reunir(*aguardaveis: Any, retornar_excecoes: bool = False) -> list:
|
|
57
|
+
"""Executa multiplos aguardaveis concorrentemente.
|
|
58
|
+
|
|
59
|
+
Args:
|
|
60
|
+
*aguardaveis: Corrotinas ou Tasks a executar.
|
|
61
|
+
retornar_excecoes: Se True, excecoes sao retornadas em vez de propagadas.
|
|
62
|
+
"""
|
|
63
|
+
return await _aio.gather(*aguardaveis, return_exceptions=retornar_excecoes)
|
|
64
|
+
|
|
65
|
+
def timeout(delay: float):
|
|
66
|
+
"""Context manager que cancela a operacao apos delay segundos."""
|
|
67
|
+
return _aio.timeout(delay)
|
|
68
|
+
|
|
69
|
+
def cancelar_ao_timeout(delay: float):
|
|
70
|
+
"""Context manager que cancela apos delay (compat anterior)."""
|
|
71
|
+
return _aio.timeout(delay)
|
|
72
|
+
|
|
73
|
+
def obter_laco() -> _aio.AbstractEventLoop:
|
|
74
|
+
"""Retorna o laco de eventos em execucao."""
|
|
75
|
+
return _aio.get_event_loop()
|
|
76
|
+
|
|
77
|
+
def novo_laco() -> _aio.AbstractEventLoop:
|
|
78
|
+
"""Cria e retorna um novo laco de eventos."""
|
|
79
|
+
return _aio.new_event_loop()
|
|
80
|
+
|
|
81
|
+
def eh_corrotina(obj: Any) -> bool:
|
|
82
|
+
"""Retorna True se obj for uma corrotina."""
|
|
83
|
+
return _aio.iscoroutine(obj)
|
|
84
|
+
|
|
85
|
+
def eh_aguardavel(obj: Any) -> bool:
|
|
86
|
+
"""Retorna True se obj for aguardavel."""
|
|
87
|
+
return _aio.isfuture(obj) or _aio.iscoroutine(obj) or _aio.iscoroutinefunction(obj)
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"""bisecao - traducao em Portugues dos modulos bisect e heapq."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
import bisect as _bis
|
|
5
|
+
import heapq as _hq
|
|
6
|
+
from typing import Any
|
|
7
|
+
|
|
8
|
+
__all__ = [
|
|
9
|
+
# bisect
|
|
10
|
+
"inserir_esquerda", "inserir_direita", "buscar_esquerda", "buscar_direita",
|
|
11
|
+
# heapq
|
|
12
|
+
"heapificar", "empurrar", "retirar", "empurrar_retirar", "retirar_empurrar",
|
|
13
|
+
"n_maiores", "n_menores", "fundir",
|
|
14
|
+
# alias
|
|
15
|
+
"inserir_ordenado", "buscar_ordenado",
|
|
16
|
+
]
|
|
17
|
+
|
|
18
|
+
def inserir_esquerda(
|
|
19
|
+
lista: list, item: Any, inicio: int = 0, fim: int | None = None
|
|
20
|
+
) -> None:
|
|
21
|
+
"""Insere item na lista ordenada, a esquerda de iguais.
|
|
22
|
+
|
|
23
|
+
Args:
|
|
24
|
+
lista: Lista ordenada.
|
|
25
|
+
item: Item a inserir.
|
|
26
|
+
inicio: Indice de inicio da busca.
|
|
27
|
+
fim: Indice de fim da busca.
|
|
28
|
+
"""
|
|
29
|
+
if fim is None:
|
|
30
|
+
_bis.insort_left(lista, item, inicio)
|
|
31
|
+
else:
|
|
32
|
+
_bis.insort_left(lista, item, inicio, fim)
|
|
33
|
+
|
|
34
|
+
def inserir_direita(
|
|
35
|
+
lista: list, item: Any, inicio: int = 0, fim: int | None = None
|
|
36
|
+
) -> None:
|
|
37
|
+
"""Insere item na lista ordenada, a direita de iguais."""
|
|
38
|
+
if fim is None:
|
|
39
|
+
_bis.insort_right(lista, item, inicio)
|
|
40
|
+
else:
|
|
41
|
+
_bis.insort_right(lista, item, inicio, fim)
|
|
42
|
+
|
|
43
|
+
inserir_ordenado = inserir_direita
|
|
44
|
+
|
|
45
|
+
def buscar_esquerda(
|
|
46
|
+
lista: list, item: Any, inicio: int = 0, fim: int | None = None
|
|
47
|
+
) -> int:
|
|
48
|
+
"""Retorna o indice de insercao a esquerda de iguais."""
|
|
49
|
+
if fim is None:
|
|
50
|
+
return _bis.bisect_left(lista, item, inicio)
|
|
51
|
+
return _bis.bisect_left(lista, item, inicio, fim)
|
|
52
|
+
|
|
53
|
+
def buscar_direita(
|
|
54
|
+
lista: list, item: Any, inicio: int = 0, fim: int | None = None
|
|
55
|
+
) -> int:
|
|
56
|
+
"""Retorna o indice de insercao a direita de iguais."""
|
|
57
|
+
if fim is None:
|
|
58
|
+
return _bis.bisect_right(lista, item, inicio)
|
|
59
|
+
return _bis.bisect_right(lista, item, inicio, fim)
|
|
60
|
+
|
|
61
|
+
buscar_ordenado = buscar_direita
|
|
62
|
+
|
|
63
|
+
def heapificar(lista: list) -> None:
|
|
64
|
+
"""Converte uma lista em heap no lugar (min-heap).
|
|
65
|
+
|
|
66
|
+
Args:
|
|
67
|
+
lista: Lista a converter.
|
|
68
|
+
"""
|
|
69
|
+
_hq.heapify(lista)
|
|
70
|
+
|
|
71
|
+
def empurrar(heap: list, item: Any) -> None:
|
|
72
|
+
"""Adiciona item ao heap mantendo a propriedade de heap.
|
|
73
|
+
|
|
74
|
+
Args:
|
|
75
|
+
heap: Heap existente.
|
|
76
|
+
item: Item a adicionar.
|
|
77
|
+
"""
|
|
78
|
+
_hq.heappush(heap, item)
|
|
79
|
+
|
|
80
|
+
def retirar(heap: list) -> Any:
|
|
81
|
+
"""Remove e retorna o menor item do heap.
|
|
82
|
+
|
|
83
|
+
Args:
|
|
84
|
+
heap: Heap existente.
|
|
85
|
+
"""
|
|
86
|
+
return _hq.heappop(heap)
|
|
87
|
+
|
|
88
|
+
def empurrar_retirar(heap: list, item: Any) -> Any:
|
|
89
|
+
"""Empurra item e retira o menor de forma eficiente."""
|
|
90
|
+
return _hq.heappushpop(heap, item)
|
|
91
|
+
|
|
92
|
+
def retirar_empurrar(heap: list, item: Any) -> Any:
|
|
93
|
+
"""Retira o menor e empurra item de forma eficiente."""
|
|
94
|
+
return _hq.heapreplace(heap, item)
|
|
95
|
+
|
|
96
|
+
def n_maiores(n: int, iteravel: Any, chave=None) -> list:
|
|
97
|
+
"""Retorna os n maiores elementos do iteravel."""
|
|
98
|
+
return _hq.nlargest(n, iteravel, key=chave)
|
|
99
|
+
|
|
100
|
+
def n_menores(n: int, iteravel: Any, chave=None) -> list:
|
|
101
|
+
"""Retorna os n menores elementos do iteravel."""
|
|
102
|
+
return _hq.nsmallest(n, iteravel, key=chave)
|
|
103
|
+
|
|
104
|
+
def fundir(*iteraveis: Any, chave=None) -> Any:
|
|
105
|
+
"""Funde iteraveis ordenados em um unico iteravel ordenado."""
|
|
106
|
+
return _hq.merge(*iteraveis, key=chave)
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"""calendario - traducao em Portugues do modulo calendar."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
import calendar as _cal
|
|
5
|
+
|
|
6
|
+
__all__ = [
|
|
7
|
+
"calendario_mes", "calendario_ano", "dias_no_mes", "eh_ano_bissexto",
|
|
8
|
+
"dia_semana", "dias_semana", "meses",
|
|
9
|
+
"SEGUNDA", "TERCA", "QUARTA", "QUINTA", "SEXTA", "SABADO", "DOMINGO",
|
|
10
|
+
"Calendario", "CalendarioTexto",
|
|
11
|
+
]
|
|
12
|
+
|
|
13
|
+
SEGUNDA = _cal.MONDAY
|
|
14
|
+
TERCA = _cal.TUESDAY
|
|
15
|
+
QUARTA = _cal.WEDNESDAY
|
|
16
|
+
QUINTA = _cal.THURSDAY
|
|
17
|
+
SEXTA = _cal.FRIDAY
|
|
18
|
+
SABADO = _cal.SATURDAY
|
|
19
|
+
DOMINGO = _cal.SUNDAY
|
|
20
|
+
|
|
21
|
+
dias_semana = list(_cal.day_name)
|
|
22
|
+
meses = list(_cal.month_name)[1:]
|
|
23
|
+
|
|
24
|
+
Calendario = _cal.Calendar
|
|
25
|
+
CalendarioTexto = _cal.TextCalendar
|
|
26
|
+
|
|
27
|
+
def calendario_mes(ano: int, mes: int, largura: int = 0) -> str:
|
|
28
|
+
"""Retorna o calendario de um mes como texto.
|
|
29
|
+
|
|
30
|
+
Args:
|
|
31
|
+
ano: Ano.
|
|
32
|
+
mes: Mes (1-12).
|
|
33
|
+
largura: Largura da coluna de dia.
|
|
34
|
+
"""
|
|
35
|
+
return _cal.month(ano, mes, largura)
|
|
36
|
+
|
|
37
|
+
def calendario_ano(ano: int) -> str:
|
|
38
|
+
"""Retorna o calendario do ano inteiro como texto.
|
|
39
|
+
|
|
40
|
+
Args:
|
|
41
|
+
ano: Ano.
|
|
42
|
+
"""
|
|
43
|
+
return _cal.calendar(ano)
|
|
44
|
+
|
|
45
|
+
def dias_no_mes(ano: int, mes: int) -> int:
|
|
46
|
+
"""Retorna o numero de dias no mes.
|
|
47
|
+
|
|
48
|
+
Args:
|
|
49
|
+
ano: Ano.
|
|
50
|
+
mes: Mes (1-12).
|
|
51
|
+
"""
|
|
52
|
+
return _cal.monthrange(ano, mes)[1]
|
|
53
|
+
|
|
54
|
+
def eh_ano_bissexto(ano: int) -> bool:
|
|
55
|
+
"""Retorna True se o ano for bissexto.
|
|
56
|
+
|
|
57
|
+
Args:
|
|
58
|
+
ano: Ano.
|
|
59
|
+
"""
|
|
60
|
+
return _cal.isleap(ano)
|
|
61
|
+
|
|
62
|
+
def dia_semana(ano: int, mes: int, dia: int) -> int:
|
|
63
|
+
"""Retorna o dia da semana (0=segunda, 6=domingo).
|
|
64
|
+
|
|
65
|
+
Args:
|
|
66
|
+
ano: Ano.
|
|
67
|
+
mes: Mes (1-12).
|
|
68
|
+
dia: Dia (1-31).
|
|
69
|
+
"""
|
|
70
|
+
return _cal.weekday(ano, mes, dia)
|