É este um uso razoável dos atributos método em python?

votos
0

Eu tenho muitos arquivos python diferentes, cada um com muitos métodos diferentes. Cada um desses métodos faz alguma tarefa, e eu quero salvar os resultados dessa tarefa com um nome de arquivo que descreve as saídas e parâmetros para esse método. Minha idéia atual é de ter, para cada método, um dicionário com um return_name: estrutura file_name, salvo como um atributo de método, por exemplo,

def addNumbers(number_1, number_2):
    addNumbers.filename_dictionary = {
        number1: number1_ + str(number_1) + .txt,
        number2: number2_ + str(number_2) + .txt
    }
    final_number = number_1 + number_2
    return final_number

A motivação básica para isso é que eu quero manter toda a informação relacionada com esse método dentro dele, então se eu queria mudar o nome do arquivo que seria fácil. Uma alternativa que pensei foi ter um método de nome semelhante que apenas retorna o dicionário, mas este parecia ser uma maneira mais conveniente de fazê-lo.

def addNumbers(number_1, number_2):
    added_number = number_1 + number_2
    multiplied_number = number_1 * number_2
    return added_number, multiplied_number

def addNumbersDictionary(number_1, number_2):
    return {
        added_number: added + str(number_1) + _+ str(number_2)+.txt,
        multiplied_number: multiplied + str(number_1) + _+ str(number_2)+.txt,
    }

Algumas perguntas: Existem falhas fundamentais para essa idéia? Existem padrões alternativos que resolveria este problema de uma forma mais padrão? É o real problema mal definido ou não faz sentido?

Obrigado por qualquer ajuda.

Publicado 18/12/2018 em 11:11
fonte usuário
Em outras línguas...                            


1 respostas

votos
1

Ok, vamos esquecer o seu código de exemplo e ficar com a sua declaração do problema principal (ligeiramente reformulada):

Eu tenho muitos arquivos python diferentes, cada um com muitas funções diferentes. Eu quero salvar resultados dessas funções com um nome de arquivo que descreve as saídas e parâmetros.

Por curiosidade, posso perguntar por que "com um nome de arquivo"?

De qualquer maneira: você quer alguma forma "salvar" os parâmetros e resultado relacionado para algumas funções chamadas. A maneira mais simples de fazer isso em Python é usar uma função decorador. Aqui está um exemplo rápido e sujo, usando um dicionário global para salvar os dados que você está interessado em:

from collections import defaultdict
from functools import wraps
saved_data = defaultdict(list)

def save(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        saved_data[func.__name__].append({"args": args, "kwargs": kwargs, "result": result})
        return result

    return wrapper 


@save
def add_nums(num1, num2):
   return num1 + num2


add_nums(1, 2)
add_nums(3, 4)
add_nums(num2=2, num1=1)

print(saved_data)

Agora que você coletou seus dados, você pode fazer o que quiser com eles.

Isto pode ser muito melhorado, claro (ou seja, evitando o mundial saved_data, utilizando inspect.getargspecs(func)ter uma representação mais uniforme dos argumentos salvos etc, mas isso deve pelo menos começar.

NB: se você realmente quer "nomes de arquivos que descrevem as saídas e parâmetros", você pode reescrever o decorador para que ele salva os "nomes" em vez dos valores reais, ou gerar esses nomes depois dos valores recolhidos.

Respondeu 18/12/2018 em 12:41
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more