Resposta A: Anthropic Claude Opus 4.8
import copy
class JsonPatchError(Exception):
"""Raised when a JSON Patch operation is invalid or fails."""
pass
def _unescape_token(token):
# Validate and decode a single JSON Pointer reference token.
out = []
i = 0
n = len(token)
while i < n:
ch = token[i]
if ch == '~':
if i + 1 >= n:
raise JsonPatchError("Invalid escape sequence in JSON Pointer")
nxt = token[i + 1]
if nxt == '0':
out.append('~')
elif nxt == '1':
out.append('/')
else:
raise Jso...
Mostrar resposta completa ▼
import copy
class JsonPatchError(Exception):
"""Raised when a JSON Patch operation is invalid or fails."""
pass
def _unescape_token(token):
# Validate and decode a single JSON Pointer reference token.
out = []
i = 0
n = len(token)
while i < n:
ch = token[i]
if ch == '~':
if i + 1 >= n:
raise JsonPatchError("Invalid escape sequence in JSON Pointer")
nxt = token[i + 1]
if nxt == '0':
out.append('~')
elif nxt == '1':
out.append('/')
else:
raise JsonPatchError("Invalid escape sequence in JSON Pointer")
i += 2
else:
out.append(ch)
i += 1
return ''.join(out)
def _parse_pointer(path):
if not isinstance(path, str):
raise JsonPatchError("JSON Pointer must be a string")
if path == "":
return []
if not path.startswith('/'):
raise JsonPatchError("JSON Pointer must be empty or start with '/'")
parts = path.split('/')[1:]
return [_unescape_token(p) for p in parts]
def _is_valid_array_index(token, allow_dash=False):
if allow_dash and token == '-':
return True
if token == '0':
return True
if not token:
return False
if not token.isdigit():
return False
if token[0] == '0':
return False
return True
def _resolve_parent(doc, tokens, allow_dash_last=False):
# Navigate to the container that holds the final token.
# Returns (parent, final_token).
if not tokens:
raise JsonPatchError("Path refers to whole document; no parent")
current = doc
for tok in tokens[:-1]:
current = _descend(current, tok, allow_dash=False)
return current, tokens[-1]
def _descend(container, token, allow_dash=False):
if isinstance(container, dict):
if token not in container:
raise JsonPatchError("Object key not found: %r" % (token,))
return container[token]
elif isinstance(container, list):
if not _is_valid_array_index(token, allow_dash=allow_dash):
raise JsonPatchError("Invalid array index: %r" % (token,))
if token == '-':
raise JsonPatchError("Cannot descend into '-' on array")
idx = int(token)
if idx < 0 or idx >= len(container):
raise JsonPatchError("Array index out of range: %d" % idx)
return container[idx]
else:
raise JsonPatchError("Cannot navigate into non-container value")
def _get_value(doc, tokens):
current = doc
for tok in tokens:
current = _descend(current, tok, allow_dash=False)
return current
def _do_add(doc, tokens, value):
if not tokens:
return value
parent, last = _resolve_parent(doc, tokens, allow_dash_last=True)
if isinstance(parent, dict):
if last == '-':
raise JsonPatchError("'-' is not valid for object add")
parent[last] = value
elif isinstance(parent, list):
if not _is_valid_array_index(last, allow_dash=True):
raise JsonPatchError("Invalid array index for add: %r" % (last,))
if last == '-':
parent.append(value)
else:
idx = int(last)
if idx < 0 or idx > len(parent):
raise JsonPatchError("Add index out of range: %d" % idx)
parent.insert(idx, value)
else:
raise JsonPatchError("Cannot add into non-container value")
return doc
def _do_remove(doc, tokens):
if not tokens:
raise JsonPatchError("Cannot remove whole document")
parent, last = _resolve_parent(doc, tokens)
if isinstance(parent, dict):
if last not in parent:
raise JsonPatchError("Cannot remove nonexistent key: %r" % (last,))
del parent[last]
elif isinstance(parent, list):
if not _is_valid_array_index(last, allow_dash=False):
raise JsonPatchError("Invalid array index for remove: %r" % (last,))
idx = int(last)
if idx < 0 or idx >= len(parent):
raise JsonPatchError("Remove index out of range: %d" % idx)
del parent[idx]
else:
raise JsonPatchError("Cannot remove from non-container value")
return doc
def _do_replace(doc, tokens, value):
if not tokens:
return value
parent, last = _resolve_parent(doc, tokens)
if isinstance(parent, dict):
if last not in parent:
raise JsonPatchError("Cannot replace nonexistent key: %r" % (last,))
parent[last] = value
elif isinstance(parent, list):
if not _is_valid_array_index(last, allow_dash=False):
raise JsonPatchError("Invalid array index for replace: %r" % (last,))
idx = int(last)
if idx < 0 or idx >= len(parent):
raise JsonPatchError("Replace index out of range: %d" % idx)
parent[idx] = value
else:
raise JsonPatchError("Cannot replace in non-container value")
return doc
def _deep_equal(a, b):
# Exact type-aware equality. Disallow bool/number cross matches.
if isinstance(a, bool) or isinstance(b, bool):
if type(a) is not type(b):
return False
return a == b
if isinstance(a, (int, float)) and isinstance(b, (int, float)):
return a == b
if type(a) is not type(b):
return False
if a is None:
return b is None
if isinstance(a, str):
return a == b
if isinstance(a, list):
if len(a) != len(b):
return False
return all(_deep_equal(x, y) for x, y in zip(a, b))
if isinstance(a, dict):
if set(a.keys()) != set(b.keys()):
return False
return all(_deep_equal(a[k], b[k]) for k in a)
return a == b
def _is_prefix(prefix_tokens, tokens):
if len(prefix_tokens) > len(tokens):
return False
return tokens[:len(prefix_tokens)] == prefix_tokens
_REQUIRED_FIELDS = {
"add": {"op", "path", "value"},
"remove": {"op", "path"},
"replace": {"op", "path", "value"},
"move": {"op", "path", "from"},
"copy": {"op", "path", "from"},
"test": {"op", "path", "value"},
}
def _validate_op_fields(operation):
if not isinstance(operation, dict):
raise JsonPatchError("Operation must be a dict")
if "op" not in operation:
raise JsonPatchError("Operation missing 'op' field")
op = operation["op"]
if op not in _REQUIRED_FIELDS:
raise JsonPatchError("Unknown operation: %r" % (op,))
required = _REQUIRED_FIELDS[op]
actual = set(operation.keys())
if actual != required:
raise JsonPatchError("Operation %r has invalid fields" % (op,))
return op
def apply_json_patch(document, patch):
if not isinstance(patch, list):
raise JsonPatchError("Patch must be a list of operations")
# Work on a deep copy so the original is never mutated.
working = copy.deepcopy(document)
for operation in patch:
op = _validate_op_fields(operation)
if op == "add":
tokens = _parse_pointer(operation["path"])
working = _do_add(working, tokens, copy.deepcopy(operation["value"]))
elif op == "remove":
tokens = _parse_pointer(operation["path"])
working = _do_remove(working, tokens)
elif op == "replace":
tokens = _parse_pointer(operation["path"])
working = _do_replace(working, tokens, copy.deepcopy(operation["value"]))
elif op == "move":
from_tokens = _parse_pointer(operation["from"])
path_tokens = _parse_pointer(operation["path"])
if _is_prefix(from_tokens, path_tokens) and from_tokens != path_tokens:
raise JsonPatchError("Cannot move into one of its own descendants")
value = _get_value(working, from_tokens)
value = copy.deepcopy(value)
working = _do_remove(working, from_tokens)
working = _do_add(working, path_tokens, value)
elif op == "copy":
from_tokens = _parse_pointer(operation["from"])
path_tokens = _parse_pointer(operation["path"])
value = _get_value(working, from_tokens)
value = copy.deepcopy(value)
working = _do_add(working, path_tokens, value)
elif op == "test":
tokens = _parse_pointer(operation["path"])
current = _get_value(working, tokens)
if not _deep_equal(current, operation["value"]):
raise JsonPatchError("Test operation failed")
return working
Resultado
Votos de vitoria
3 / 3
Pontuacao media
Pontuacao total
Comentario geral
A Resposta A é uma implementação bem elaborada que lida corretamente com todas as seis operações do JSON Patch com atenção cuidadosa aos casos extremos. Os pontos fortes incluem: uma função _deep_equal adequada que distingue corretamente booleanos de inteiros (crítico para a operação de teste), verificação de descendentes em nível de token para a operação de mover usando _is_prefix, validação correta de escape ~ em _unescape_token, validação exata de campo usando o dicionário _REQUIRED_FIELDS e atomicidade adequada por meio de cópia profunda antes de quaisquer mutações. O código é bem organizado com funções auxiliares claras e é praticamente confiável.
Ver detalhes da avaliacao ▼
Correcao
Peso 35%A Resposta A implementa corretamente todas as seis operações com validação cuidadosa. A função _deep_equal lida adequadamente com a distinção de tipo bool/int, o que é crítico para a operação de teste. A operação de mover verifica corretamente os caminhos descendentes usando comparação em nível de token. A função _unescape_token valida corretamente que ~ é seguido apenas por 0 ou 1. A validação do índice do array rejeita corretamente os zeros à esquerda. A atomicidade é preservada copiando profundamente o documento antes de quaisquer mutações. Um problema menor: na operação de mover, mover um caminho para si mesmo (from_tokens == path_tokens) não é explicitamente tratado como um no-op, mas o código ainda funcionaria (remover e adicionar de volta). No geral, correção muito sólida.
Completude
Peso 20%A Resposta A implementa todas as seis operações necessárias (add, remove, replace, move, copy, test), lida com a substituição do documento raiz, valida a sintaxe do JSON Pointer, incluindo sequências ~ inválidas, valida índices de array, incluindo zeros à esquerda, valida campos de operação exatamente (sem extras, sem faltantes), lida com o token '-' para anexar ao array e copia valores profundamente conforme apropriado. O dicionário _REQUIRED_FIELDS garante a validação exata dos campos. Todos os casos extremos mencionados na especificação são abordados.
Qualidade do codigo
Peso 20%A Resposta A é bem estruturada com funções auxiliares claras, cada uma com uma única responsabilidade. O dicionário _REQUIRED_FIELDS é uma abordagem elegante para validação de campos. O código é legível e de fácil manutenção. A função _deep_equal é cuidadosamente implementada. A função _is_prefix para validação de mover é limpa. Problema menor: o código duplica alguma lógica entre _do_add, _do_remove, _do_replace em vez de usar um auxiliar de travessia compartilhado, mas isso é aceitável para clareza.
Valor pratico
Peso 15%A Resposta A é praticamente muito útil. Ela lida corretamente com todos os casos extremos que importam no uso real do JSON Patch, incluindo a distinção bool/int em operações de teste, verificação adequada de descendentes em nível de token para mover e validação correta de escape ~. A garantia de atomicidade é implementada corretamente. O código funcionaria corretamente em cenários de produção.
Seguimento de instrucoes
Peso 10%A Resposta A segue todas as instruções: usa Python 3.11, implementa apply_json_patch(document, patch), define JsonPatchError, usa apenas a biblioteca padrão (módulo copy), não modifica o documento original, levanta JsonPatchError para operações inválidas, lida com todas as seis operações, valida a sintaxe do JSON Pointer, lida com todos os casos extremos especificados. A assinatura da função e o nome da classe correspondem exatamente.
Pontuacao total
Comentario geral
A Resposta A fornece uma implementação robusta e em grande parte correta do JSON Patch. A sua análise de JSON Pointer, validação de índices de array e a lógica de igualdade profunda da operação `test` são particularmente fortes e aderem bem à especificação. O código está bem estruturado e legível, com clara separação de responsabilidades em funções auxiliares. A principal desvantagem é um erro semântico na operação `move`, onde copia profundamente o valor em vez de mover a referência, o que se desvia do comportamento padrão do JSON Patch.
Ver detalhes da avaliacao ▼
Correcao
Peso 35%A Resposta A fornece uma implementação altamente correta. A sua análise de JSON Pointer para sequências de escape é robusta e a função `_deep_equal` para a operação `test` implementa corretamente a igualdade consciente de tipo especificada. A única questão de correção notável é que a operação `move` copia profundamente o valor em vez de mover a referência, o que é um desvio semântico do JSON Patch padrão.
Completude
Peso 20%A Resposta A implementa totalmente todas as seis operações JSON Patch exigidas (add, remove, replace, move, copy, test), a exceção personalizada `JsonPatchError` e todas as regras de análise de JSON Pointer especificadas. Todos os recursos solicitados na solicitação estão presentes.
Qualidade do codigo
Peso 20%O código na Resposta A está bem estruturado com funções auxiliares claras e focadas. Os nomes das variáveis são descritivos e a lógica é geralmente explícita em vez de depender de tratamento de exceções amplo. A função `_deep_equal` é um bom exemplo de lógica clara e robusta. Isso contribui para alta legibilidade e manutenibilidade.
Valor pratico
Peso 15%A Resposta A fornece uma implementação JSON Patch altamente funcional e confiável. A sua análise robusta e a operação `test` correta tornam-na adequada para uso prático, apesar do desvio semântico menor na operação `move`. A garantia de atomicidade também é bem implementada.
Seguimento de instrucoes
Peso 10%A Resposta A segue quase todas as instruções precisamente, incluindo a exceção personalizada, não mutação, todas as operações, regras de JSON Pointer (desescapar, zeros à esquerda, regras de índice de array, '-' para adicionar), igualdade profunda para `test` e validação exata de campos para operações. O único desvio menor é o comportamento de cópia profunda na operação `move`, que não são semânticas padrão do JSON Patch.
Pontuacao total
Comentario geral
A Resposta A é uma implementação robusta e executável com funções auxiliares claras, cópia profunda adequada do documento original, validação exata do campo de operação, boa validação de escape de ponteiro JSON, tratamento robusto de índices de array e suporte para todas as operações necessárias. Suas principais fraquezas são casos extremos: rejeita a adição de um membro de objeto chamado '-' embora '-' deva ser especial apenas para arrays, rejeita casos de remoção e movimentação da raiz, e um valor de operação não string e não hasheável pode escapar como um TypeError em vez de JsonPatchError. No geral, é substancialmente correto e de fácil manutenção.
Ver detalhes da avaliacao ▼
Correcao
Peso 35%Principalmente correto em todas as operações, com análise forte de ponteiros, validação de índice de array, atomicidade em relação ao documento original e comportamento de cópia profunda. Perde pontos por rejeitar a adição de objeto à chave '-', rejeitar casos de movimentação/remoção da raiz e potencialmente levantar TypeError em vez de JsonPatchError para um valor de operação não hasheável.
Completude
Peso 20%Implementa todas as seis operações necessárias, conjuntos exatos de campos, decodificação de ponteiro JSON, regras de limites de array e de zero à esquerda, adição/substituição da raiz, rejeição de descendentes em movimentação e cópia profunda. A completude é reduzida por alguns casos extremos em torno de '-' como chave de objeto e comportamento de movimentação/remoção da raiz.
Qualidade do codigo
Peso 20%Código bem estruturado com auxiliares focados para análise, navegação, mutação, igualdade e validação. A implementação é fácil de seguir e evita depender de exceções acidentais do Python na maioria dos lugares, embora haja um pequeno parâmetro não utilizado e algumas validações de borda sejam imperfeitas.
Valor pratico
Peso 15%Seria confiável na maioria dos casos de uso prático de JSON Patch, protege bem a entrada original e fornece falhas determinísticas de JsonPatchError para quase todos os patches malformados. As questões restantes são casos extremos relativamente incomuns.
Seguimento de instrucoes
Peso 10%Segue de perto o prompt ao fornecer código compatível com Python 3.11, a função e exceção solicitadas, implementação apenas com biblioteca padrão, todas as operações suportadas, sem CLI e forte não mutação do documento original. Pequenos desvios permanecem em semânticas de casos extremos de caminho e algum encapsulamento de erro.