Pular para o conteúdo

Comparação com Python

O que muda para quem vem de Python, lado a lado.

A tabela#

PythonDataForgeNota
x = 1x := 1= sozinho não existe
print(x)out x
f"{x}"$"{x}"
if/elif/elsegiven/orif/otherwise
a if c else ba given c otherwise bmesma ordem
match/casematch/pointwhen no lugar de if
for x in xs:cycle x in xs:
for i in range(1,6)cycle i from 1 to 5:inclusivo
whilepersist
break/continuehalt/skip
def/returnaction/yield
yield (gerador)stream action + emitseparados de propósito
lambda x: elambda x: eigual
classblueprint
Clas()spawn Clas()
selfselfigual
super()root
@dataclass(frozen=True)recordimutável por padrão
Enumenum
Protocol / ABCtrait
import xadopt x
from x import yadopt x.{y}
__all__relayde verdade, não convenção
try/except/finallymonitor/handle/ensure
raisetrigger
True/False/Noneyes/no/void
[e for x in xs if c][e cycle x in xs given c]
{k: v for …}{k: v cycle …}
a, *r = xsa, ...r := xs
[*a, *b][...a, ...b]
{**a, **b}{...a, ...b}
f(*args)f(...args)
x if x else yx ?? y?? só dispara em void
x and x.yx?.y
//~/em DataForge, // é comentário
@decoratormark @decorator
with open(…) as f:defer no lugarsem gerenciador de contexto
filter/map/reduce>> sift/morph/distill

O que DataForge tem e Python não#

  • Pipelines como sintaxe>> faz parte da gramática
  • `?.` e `??` — acesso seguro e coalescência nativos
  • Análise estática embutida — sem instalar mypy
  • `guard` — pré-condição que sai da ação
  • `retry` — repetição com handler, sem biblioteca
  • Padrões de record por nomepoint P(campo := valor)

O que Python tem e DataForge não#

  • Genericslist[int], TypeVar
  • Gerenciador de contextowith
  • Ecossistema — numpy, pandas, requests, e os outros 500 mil pacotes
  • LSP e debugger maduros
  • Desempenho — mesmo o CPython é mais rápido
  • `async` real — em DataForge o await é síncrono por enquanto

Traduzindo um script#

Python
# Python
def media(notas):
    if not notas:
        return 0
    return sum(notas) / len(notas)

aprovados = [a for a in alunos if a["nota"] >= 7]
print(f"{len(aprovados)} aprovados, media {media([a['nota'] for a in alunos]):.2f}")
DataForge
action media(notas: Cluster) -> Float:
    given len(notas) is 0:
        yield 0.0
    yield sum(notas) / len(notas)

aprovados := alunos >> sift a: a["nota"] bigger_eq 7
todas := alunos >> morph a: a["nota"]
out $"{len(aprovados)} aprovados, media {round(media(todas), 2)}"