MEP25: número de serialização
Estado #
rejeitado
Este trabalho é importante, mas este esforço específico estagnou.
Filiais e solicitações pull #
ramos de desenvolvimento:
solicitações pull relacionadas:
Resumo #
Este MEP visa adicionar Controllerobjetos serializáveis para atuar como Artistgerenciadores. Os usuários então comunicariam as alterações a um
Artistpor meio de um arquivo Controller. Dessa forma, a funcionalidade dos
Controllerobjetos pode ser adicionada de forma incremental, pois cada
Artistum ainda é responsável por desenhar tudo. O objetivo é criar uma API que seja utilizável tanto por bibliotecas de gráficos que requerem descrições de figuras de alto nível quanto por bibliotecas que requerem interpretações de baixo nível.
Descrição detalhada #
Matplotlib é um mecanismo de plotagem central com uma API que muitos usuários já entendem. É difícil/impossível para outras bibliotecas gráficas (1) obter uma descrição completa da figura, (2) produzir dados brutos do objeto da figura conforme o usuário os forneceu, (3) entender a semântica dos objetos da figura sem heurística e ( 4) forneça ao matplotlib uma descrição completa da figura para visualizar. Além disso, como an Artistnão tem concepção de sua própria semântica dentro da figura, é difícil interagir com eles de maneira natural.
Nesse sentido, o matplotlib adotará uma estrutura padrão Model-View-Controller (MVC). O modelo será os dados, estilo e semântica definidos pelo usuário. As Views são o conjunto de cada indivíduo Artist, que são responsáveis por produzir a imagem final baseada no modelo . O Controller será o
Controllerobjeto gerenciando seu conjunto de Artistobjetos.
O Controllerdeve ser capaz de exportar as informações que carrega sobre a figura no comando, talvez por meio de um to_jsonmétodo ou similar. Como seria extremamente estranho duplicar todas as informações no modelo com o controlador, apenas as informações especificadas pelo usuário (dados + estilo) são explicitamente mantidas. Se um usuário quiser mais informações (padrão) da visão/modelo, ele poderá consultá-las.
Isso pode ser chato de fazer, kwargs não especificados são extraídos do objeto rcParams que, por sua vez, é criado a partir da leitura de um arquivo especificado pelo usuário e pode ser alterado dinamicamente em tempo de execução. Suponho que poderíamos manter um ditado de padrões padrão e comparar com isso. Não está claro como isso irá interagir com a folha de estilo [[MEP26]] - @tacaswell
Notas Adicionais:
Os "dados brutos" não precisam necessariamente ser um
list,ndarray, etc. Em vez disso, podem ter apenas um método mais abstrato para fornecer dados quando necessário.Como o
Controllerirá conter informações extras que os usuários podem não querer manter, ele não deve ser criado por padrão. Você deve ser capaz de (a) instanciar aControllercom uma figura e (b) construir uma figura com aController.
Casos de uso:
Exporte todas as informações necessárias
Serializar uma figura matplotlib, salvá-la e poder executá-la novamente mais tarde.
Qualquer outra fonte enviando uma representação formatada apropriadamente para matplotlib para abrir
Exemplos #
Aqui estão alguns exemplos do que os controladores devem ser capazes de fazer.
Instancie uma figura matplotlib a partir de uma representação serializada (por exemplo, JSON):
import json from matplotlib.controllers import Controller with open('my_figure') as f: o = json.load(f) c = Controller(o) fig = c.figure
Gerenciar artistas do controlador (por exemplo, Line2D):
# not really sure how this should look c.axes[0].lines[0].color = 'b' # ?
Exportar representação de figura serializável:
o = c.to_json() # or... we should be able to throw a figure object in there too o = Controller.to_json(mpl_fig)
Implementação #
Crie
Controllerobjetos base que são capazes de gerenciarArtistobjetos (por exemplo,Hist)Comentários:
a inicialização deve ocorrer por meio de unpacking
**, portanto, precisamos de uma cópia do parâmetro de assinatura de chamada para oArtistque estamos tentando controlar. Repetição codificada infeliz...caso os adicionais
**kwargsaceitos por cada umArtistsejam rastreados noControllercomo
Controllersaber qual artista pertence a onde? Por exemplo, precisamos passaraxesreferências?
Progresso:
Um NB simples demonstrando algumas funcionalidades para
Line2DControllerobjetos: https://nbviewer.jupyter.org/gist/theengineear/f0aa8d79f64325e767c0
Escreva os protocolos para
Controlleratualizar o modelo.Comentários:
como os contêineres devem ser tratados? Por exemplo, o que acontece com patches antigos quando redefinimos um histograma?
no link de (1), a linha antiga é completamente destruída e redesenhada, e se algo estiver fazendo referência a ela?
Criar método pelo qual um objeto json pode ser montado a partir do
ControllersLidar com a serialização dos aspectos não serializáveis de uma figura (por exemplo, transformações não afins?)
Ser capaz de instanciar a partir de uma representação serializada
Reimplemente o pyplot existente e o método Axes, por exemplo,
pyplot.histeAxes.histem termos da nova classe do controlador.
> @theengineer: no item 2 acima, o que você quer dizer com obter atualizações de cada um Artist?
^ Sim. O Controller não deve precisar ser atualizado. Isso só acontece no #3. Exclua os comentários quando vir isso.
Compatibilidade com versões anteriores #
decapagem vai mudar
transformações não afins exigirão um método de decapagem definido
Alternativas #
O PR #3150 sugeriu adicionar semântica anexando parasiticamente contêineres extras a objetos axes. Esta é uma solução mais completa com o que deveria ser um framework mais desenvolvido/flexível/poderoso.