Semana 49 de 2024

This is an old revision of the document!


Semana 49 de 2024

Capacitação

  • AWS
    • Início do curso “AWS Cloud Technical Essentials”.
    • Criação de conta no https://repost.aws. O re:Post é um fórum para perguntas sobre o AWS.

Pesquisa

  • Correção automática de programas
    • Um problema que tive recentemente foi quanto a redefinição de módulos e funções da biblioteca básica do Python.
    • Normalmente, poderíamos usar dublês (mocks) para sobrepor o comportamento de alguma função ou método de uma classe. No entanto, isso não é tecnicamente possível (ao menos com as ferramentas atuais) para os módulos e funções da biblioteca básica/padrão do Python (builtin).
    • Mais especificamente, eu precisava sobreescrever o comportamento da função time do módulo time.
    • Existe mais um adendo de que, por ser para uma disciplina introdutório, eu não queria criar um objeto ou forçar uma abstração além daquilo que os estudantes, que estão aprendendo o básico da programação, precisam.
    • Em tese, seria suficiente criar um arquivo 'time.py' com a função em questão. Isso seria verdade se, no ambiente de avaliação automática que utilizo, o CodeRunner do Moodle, isso fosse permitido.
    • Assim, resolvi ser criativo e verificar como ocorre o carregamento dos módulos e se existia algo que eu pudesse trabalhar naquele nível. Eis que os problemas surgem :-)
    • A implementação padrão do Python, CPython, está disponível de forma aberta em https://github.com/python/cpython. Outro aspecto positivo é que, embora a implementação padrão do import seja em C (Python/import.c, em https://github.com/python/cpython), o carregamento de módulos também pode ser realizado por código escrito em Python. O módulo importlib possui tudo que é necessário: https://github.com/python/cpython/blob/main/Lib/importlib/. Não é um módulo bonito e fácil de ler, mas servirá como inspiração para uma solução.
    • Um desenvolvedor criou um módulo ''module-found'' que, usando o importlib, faz algo bem legal: ele utiliza uma aplicação de modelo de linguagem (LLM), mais precisamente um modelo da OpenAI, para gerar automaticamente o código em Python, considerando uma descrição informada como parâmetro, referente a uma função de um módulo que não existem em Python. Ou seja, ao invés de lançar uma exceção de que o módulo ou função não foi encontrado, ele cria automaticamente o módulo e a função necessários. No caso, eu não preciso gerar automaticamente código, dado que eu sei exatamente o que eu preciso. No entanto, o mecanismo é o mesmo (com a diferença que eu quero sobreescrever um módulo ou função existente).
      • Só para complementar, outro módulo Python que faz algo nessa linha, no caso instalando automaticamente (em tempo de execução) os módulos não encontrados é o ''pipimport''.
    • A importação de pacotes do Python até que é simples de entender, sob certo aspecto. Existe uma classe para encontrar módulos e outra classe para carregar módulos.
      • Para encontrar os módulos, são utilizadas as classes BuiltinImporter, FrozenImporter e PathFinder. As duas primeiras são para carregar os módulos padrões do Python e a terceira é para carregar os módulos disponíveis no sistema de arquivo (este último utiliza a variável sys.path, amplamente empregada para configuração de ambientes virtuais).
      • As classes a serem utilizadas estão definidas na variável sys.meta_path. Basicamente, ao procurar por um nome (módulo, função ou variável), o Python percorre os objetos disponíveis nessa variável, utilizando-os para encontrar o que deseja.
    • Entendido isso, bastaria criar uma nova classe Finder e colocá-la no início do caminho.
    • No entanto, no código de importação do módulo importlib é feito um grande esforço para não permitir a sobreescrita de módulos builtins. Na função _find_and_load()' do '_bootstrap.py', antes de começar a busca pelo módulo é verificado se ele está presente em sys.modules. Em * Bom, nem tudo são flores. Por algum motivo muito estranho, alguns módulos builtins do Python não podem ser sobreescritos por esse mecanismo. Mais especificamente o módulo time'' não pode.
work/2024-49.1734139915.txt.gz · Last modified: 2024/12/14 01:31 by magsilva