Python para Devs Java Guia Focado · Projeto Marvis · Atech
PROJETO MARVIS · ATECH
Python para Devs Java
Guia de sobrevivência focado exatamente no que você vai usar.
Você já sabe lógica e POO com Java. Este guia cobre só a sintaxe Python necessária para
construir o Marvis — sem enrolação, sem teoria desnecessária.
7 seções Java vs Python Exemplos reais
de sintaxe essencial em cada tópico do código do Marvis
Atech · Marvis ProjectVocê já sabe lógica. Só falta a sintaxe.
Python para Devs Java Guia Focado · Projeto Marvis · Atech
1 Variáveis e Tipos
Sem declaração de tipo — Python infere automaticamente
Em Java você declara o tipo antes da variável. Em Python, simplesmente atribui o valor — o tipo é
inferido. Não existe int, String ou ponto-e-vírgula.
Python · Marvis Java · Equivalente
# Python — sem tipo, sem // Java — tipo obrigatório
ponto-e-vírgula
nome = 'Marvis' String nome = "Marvis";
versao = 1 int versao = 1;
preco = 9.99 double preco = 9.99;
ativo = True boolean ativo = true;
nada = None Object nada = null;
# Múltipla atribuição // Sem equivalente direto
x, y, z = 1, 2, 3
# f-string (equivale ao [Link]) // [Link]
msg = f'Projeto {nome} v{versao}' String msg = [Link]("Projeto %s
v%d", nome, versao);
🐍 No Marvis você vai usar f-strings o tempo todo
Ex: [Link](f'[green]Marvis v{versao} inicializado[/green]') — a variável vai direto dentro das {}.
Atech · Marvis ProjectVocê já sabe lógica. Só falta a sintaxe.
Python para Devs Java Guia Focado · Projeto Marvis · Atech
2 Funções e Type Hints
def no lugar de void/return type — indentação é obrigatória
Python usa def para declarar funções. Sem chaves {} — a indentação (4 espaços) define os blocos.
Type hints são opcionais mas recomendados para legibilidade.
Python · Marvis Java · Equivalente
# Função simples // Método de instância
def somar(a, b): int somar(int a, int b) {
return a + b return a + b;
}
# Com type hints (recomendado)
def somar(a: int, b: int) -> int: // Tipos sempre explícitos
return a + b int somar(int a, int b) {
return a + b;
# Valor padrão de parâmetro }
def cumprimentar(nome: str, formal:
bool = False) -> str:
if formal: // Sobrecarga de método
return f'Bom dia, {nome}.' String cumprimentar(String nome) { ...
}
return f'Oi, {nome}!' String cumprimentar(String nome,
boolean formal) {
... }
# Chamada
cumprimentar('Ana') # usa // Chamada
formal=False
cumprimentar('Ana', formal=True) cumprimentar("Ana");
cumprimentar("Ana", true);
Exemplo real do Marvis:
# No Marvis — exemplo real de core/[Link]
def send(self, messages: list, system: str) -> str:
response = [Link](
model=[Link],
max_tokens=self.max_tokens,
system=system,
messages=messages
)
return [Link][0].text
Atech · Marvis ProjectVocê já sabe lógica. Só falta a sintaxe.
Python para Devs Java Guia Focado · Projeto Marvis · Atech
3 Classes e self
self é o this do Java — e deve aparecer em todo método
Classes em Python têm sintaxe mais limpa que Java. O construtor se chama __init__ e o self é o
equivalente ao this — mas precisa ser declarado explicitamente em cada método.
Python · Marvis Java · Equivalente
class MarvisAgent: class MarvisAgent {
# Atributo de classe (static) // Atributo estático
versao = '0.1.0' static String versao = "0.1.0";
# Construtor // Construtor
def __init__(self, model: str): public MarvisAgent(String model) {
[Link] = model # [Link] = model;
atributo de instância
[Link] = [] [Link] = new
ArrayList<>();
}
# Método
def chat(self, mensagem: str) -> // Método
str:
[Link](mensagem) public String chat(String mensagem)
{
return f'Resposta de [Link](mensagem);
{[Link]}'
return "Resposta de " + model;
# Método estático }
@staticmethod
def versao_atual() -> str: // Método estático
return [Link] public static String versaoAtual()
{
return [Link];
# Instanciar }
agente = }
MarvisAgent('claude-sonnet-4-5')
[Link]('Olá') // Instanciar
MarvisAgent agente = new
MarvisAgent(...);
[Link]("Olá");
⚠️ Toda classe do Marvis vai ter __init__ + self
Se esquecer o self como primeiro parâmetro do método, Python vai lançar TypeError. É o erro mais
comum de quem vem do Java.
Atech · Marvis ProjectVocê já sabe lógica. Só falta a sintaxe.
Python para Devs Java Guia Focado · Projeto Marvis · Atech
4 Listas e Dicionários
list = ArrayList | dict = HashMap — mas muito mais simples
Estas duas estruturas estão em absolutamente todo código Python. O histórico de mensagens do
Marvis é uma list de dicts — você vai usá-las centenas de vezes.
Python · Marvis Java · Equivalente
# LIST — equivale ao ArrayList<T> // ArrayList<String>
msgs = [] # lista List<String> msgs = new ArrayList<>();
vazia
msgs = ['a', 'b', 'c'] List<String> msgs =
[Link]("a","b","c");
[Link]('d') # add() [Link]("d");
msgs[0] # get(0) → [Link](0);
'a'
msgs[-1] # último → [Link]([Link]() - 1);
'd'
len(msgs) # size() [Link]();
msgs[1:3] # slice → [Link](1, 3);
['b','c']
'a' in msgs # [Link]("a");
contains()
# DICT — equivale ao HashMap<K,V> // HashMap<String, String>
msg = {} # dict Map<String,String> msg = new
vazio HashMap<>();
msg = {'role': 'user', [Link]("role", "user");
'content': 'Olá'} [Link]("content", "Olá");
msg['role'] # [Link]("role");
get('role')
msg['novo'] = 'valor' # put() [Link]("novo", "valor");
'role' in msg # [Link]("role");
containsKey()
[Link]('x', 'default') # [Link]("x", "default");
getOrDefault()
[Link]() / [Link]() [Link]() / [Link]();
Estrutura real do histórico no Marvis:
# No Marvis — histórico de mensagens é exatamente isso:
messages = [
{'role': 'user', 'content': 'Quem é você?'},
{'role': 'assistant', 'content': 'Sou o Marvis da Atech.'},
{'role': 'user', 'content': 'O que você faz?'},
]
# Adicionar nova mensagem:
[Link]({'role': 'user', 'content': novo_input})
# Percorrer:
for msg in messages:
print(msg['role'], msg['content'])
Atech · Marvis ProjectVocê já sabe lógica. Só falta a sintaxe.
Python para Devs Java Guia Focado · Projeto Marvis · Atech
5 Controle de Fluxo e Loops
if / for / while — mesma lógica, sintaxe mais limpa
Python · Java · Equivalente
Marvis
# IF / // IF / ELSE IF / ELSE
ELIF /
ELSE
if cmd if ([Link]("/quit")) {
==
'/quit'
:
return false;
return
False
elif } else if ([Link]("/reset")) {
cmd ==
'/reset
':
[Link]();
agente.
reset()
else: } else {
[Link]("Inválido");
print('
Comando
inválid
o')
}
# FOR — // FOR-EACH
itera
diretam
ente no
objeto
for msg for (Map<String,String> msg : messages) {
in
message
s:
[Link]([Link]("content"));
print(m
sg['con
tent'])
}
# FOR // FOR com índice
com
índice
for i, for (int i=0; i<[Link](); i++) {
msg in
enumera
te(mess
ages):
[Link](i + ": " + ...) ;
print(f
'{i}:
{msg["c
ontent"
]}')
}
# FOR // FOR numérico
tipo
range
Atech · Marvis ProjectVocê já sabe lógica. Só falta a sintaxe.
Python para Devs Java Guia Focado · Projeto Marvis · Atech
(Java:
for
i=0;
i<5;
i++)
for i for (int i = 0; i < 5; i++) {
in
range(5
):
#
0,1,2,3
,4
[Link](i);
print(i
)
}
# WHILE // WHILE
while while (true) {
True:
String e = [Link]();
entrada
=
input('
> ')
if if ([Link]("sair")) break;
entrada
==
'sair':
break
}
# LIST // Sem equivalente direto (Stream API é verboso)
COMPREH
ENSION
(podero
so!)
textos List<String> textos = [Link]()
=
[m['con
tent']
for m
in
message
s]
usuario .map(m -> [Link]("content")).collect(...);
s = [m
for m
in
message
s if
m['role
']=='us
er']
🐍 List comprehension vai aparecer muito no Marvis
A linha: textos = [t for t in [Link] if [Link] == 'text'] — filtra e transforma a lista em uma linha.
É o padrão usado no SDK da Anthropic.
Atech · Marvis ProjectVocê já sabe lógica. Só falta a sintaxe.
Python para Devs Java Guia Focado · Projeto Marvis · Atech
6 Exceções, Arquivos e with
try/except = try/catch | with = try-with-resources
Python · Java · Equivalente
Marvis
# TRY / // TRY / CATCH / FINALLY
EXCEPT
/
FINALLY
try: try {
String r = [Link](msgs);
respost
a =
cliente
.send(m
sgs)
except } catch (IllegalArgumentException e) {
ValueEr
ror as
e:
[Link]("Erro: " + e);
print(f
'Erro
de
valor:
{e}')
except } catch (Exception e) {
Excepti
on as
e:
[Link]("Erro: " + e);
print(f
'Erro
genéric
o:
{e}')
finally } finally {
:
[Link]("Sempre");
print('
Sempre
executa
')
}
# // Lançar exceção
Lançar
exceção
raise throw new IllegalArgumentException("...");
ValueEr
ror('AP
I key
ausente
')
# ABRIR // TRY-WITH-RESOURCES
ARQUIVO
— with
fecha
automat
icament
e
Atech · Marvis ProjectVocê já sabe lógica. Só falta a sintaxe.
Python para Devs Java Guia Focado · Projeto Marvis · Atech
with try (BufferedReader r =
open('p
rompt.m
d',
'r',
encodin
g='utf-
8') as
f:
new BufferedReader(new FileReader("f"))) {
conteud
o =
[Link](
)
# lê
tudo
String conteudo = [Link]()...
# }
Escreve
r
arquivo
with // Escrever arquivo
open('o
utput.m
d',
'w',
encodin
g='utf-
8') as
f:
try (FileWriter fw = new FileWriter("out")) {
[Link]
('#
Roadmap
\n')
[Link]("# Roadmap\n");
[Link]
(conteu
do)
[Link](conteudo);
# }
Verific
ar se
arquivo
existe
import // Verificar se existe
os
if File f = new File("[Link]");
[Link]
.exists
('promp
[Link]'):
if ([Link]()) { ... }
print('
Arquivo
encontr
ado')
Exemplo real do Marvis — leitura de arquivo com tratamento:
# No Marvis — carregando o System Prompt:
def load_system_prompt(path: str = 'prompts/system_prompt.md') -> str:
if not [Link](path):
Atech · Marvis ProjectVocê já sabe lógica. Só falta a sintaxe.
Python para Devs Java Guia Focado · Projeto Marvis · Atech
raise FileNotFoundError(f'Arquivo não encontrado: {path}')
try:
with open(path, 'r', encoding='utf-8') as f:
return [Link]().strip()
except Exception as e:
raise RuntimeError(f'Erro ao ler prompt: {e}')
Atech · Marvis ProjectVocê já sabe lógica. Só falta a sintaxe.
Python para Devs Java Guia Focado · Projeto Marvis · Atech
7 Imports, Módulos e Ambiente
import = import Java | [Link] = [Link]
Python organiza código em módulos (arquivos .py). Para usar código de outro arquivo, você importa. O
os é o equivalente ao System do Java para variáveis de ambiente e caminhos de arquivo.
Python · Marvis Java · Equivalente
# Importar módulo inteiro // Import de pacote
import os import [Link];
import json import [Link].*;
# Importar só o que precisa // Sem equivalente — Java sempre
(recomendado) importa a classe
from pathlib import Path import [Link];
from typing import List, Dict, Optional import [Link];
import [Link];
# Importar de arquivo local
from [Link] import MarvisClient // Import de classe local (mesmo pacote
= automático)
from [Link] import import [Link];
ConversationMemory
from prompts import load_system_prompt import
[Link];
# Variáveis de ambiente // Variáveis de ambiente
import os import
[Link];
from dotenv import load_dotenv
Dotenv dotenv = [Link]();
load_dotenv() # carrega o .env
String apiKey =
[Link]("ANTHROPIC_API_KEY");
api_key = String model =
[Link]('ANTHROPIC_API_KEY') [Link]("MARVIS_MODEL",
model = [Link]('MARVIS_MODEL',
'claude-sonnet-4-5') "claude-sonnet-4-5");
if (apiKey == null) {
if not api_key: throw new
IllegalStateException("...");
raise ValueError('API key }
ausente!')
Generators com yield — padrão do streaming no Marvis:
# Generators e yield — usados no streaming do Marvis
# yield é como retornar parcialmente, mantendo o estado da função
def stream_chat(self, user_input: str):
[Link].add_user(user_input)
full_response = []
# 'yield' entrega um valor e PAUSA — a função continua depois
for token in [Link](messages=[Link].get_history(),
system=self.system_prompt):
full_response.append(token)
yield token # ← cada token é entregue imediatamente
[Link].add_assistant(''.join(full_response))
Atech · Marvis ProjectVocê já sabe lógica. Só falta a sintaxe.
Python para Devs Java Guia Focado · Projeto Marvis · Atech
# Consumir um generator:
for token in agente.stream_chat('Olá'): # cada iteração recebe um token
print(token, end='', flush=True)
⚡ yield é o coração do streaming
Em vez de esperar a resposta completa, yield entrega cada pedaço assim que chega. É exatamente o
que faz o texto aparecer progressivamente no terminal do Marvis.
Atech · Marvis ProjectVocê já sabe lógica. Só falta a sintaxe.
Python para Devs Java Guia Focado · Projeto Marvis · Atech
Cheat Sheet · Referência Rápida
Conceito Python Java
Variável string nome = 'Marvis' String nome = "Marvis";
Interpolação f'Olá {nome}' [Link]("Olá %s",
nome)
Null None null
Booleano True / False true / false
Função def fn(a: int) -> str: String fn(int a) {
Construtor def __init__(self): public Classe() {
This [Link] [Link]
Lista vazia lista = [] new ArrayList<>()
Dicionário d = {'k': 'v'} new HashMap<>()
Adicionar lista [Link](x) [Link](x)
Tamanho len(lista) [Link]()
Contém? 'x' in lista [Link]("x")
Try/Catch try: ... except Ex as e: try { } catch(Ex e) { }
Lançar erro raise ValueError('msg') throw new
IllegalArgumentException()
Ler arquivo open('f', 'r') as f: new FileReader("f")
[Link]()
Var de ambiente [Link]('KEY') [Link]("KEY")
Import local from [Link] import import
Agent [Link];
Comentário # comentário // comentário
Print print(f'texto {var}') [Link]("texto
"+var);
Retorno return valor return valor;
PYTHON PARA DEVS JAVA · PROJETO MARVIS · ATECH
A lógica você já tem. A sintaxe é só uma questão de dias.
Atech · Marvis ProjectVocê já sabe lógica. Só falta a sintaxe.