Czy to jest rozsądne wykorzystanie atrybutów metody w Pythonie?

głosy
0

Mam wiele różnych plików Python, każdy z wielu różnych metod. Każda z tych metod ma pewne zadania, a ja chcę, aby zapisać wyniki tego zadania z pliku opisującego wyjść i parametry dla tej metody. Mój obecny pomysł jest mieć, dla każdej metody, słownik z return_name: struktury nazwa_pliku, zapisane jako atrybut metody, np

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

Podstawową motywacją jest to, że chcę zachować wszystkie informacje dotyczące tej metody wewnątrz niej, więc gdybym chciał zmienić nazwę pliku byłoby łatwe. Jedną z alternatyw myślałem było mieć podobnie nazwie metodę, która po prostu zwraca słownika, ale ten wydawał się bardziej wygodny sposób, aby to zrobić.

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,
    }

Niektóre pytania: Czy istnieją jakieś fundamentalne wady do tego pomysłu? Czy istnieją alternatywne wzory, które rozwiążą ten problem w bardziej standardowy sposób? Jest rzeczywisty problem słabo zdefiniowane lub nie ma sensu?

Dzięki za wszelką pomoc.

Utwórz 18/12/2018 o 11:11
źródło użytkownik
W innych językach...                            


1 odpowiedzi

głosy
1

Ok, zapomnijmy o swojej przykład kodu i po prostu trzymać się z głównego rachunku problem (nieznacznie przeformułować):

Mam wiele różnych plików Python, każdy z wielu różnych funkcji. Chcę zapisać wyniki tych funkcji z pliku opisującego wyjść i parametrów.

Z ciekawości, czy mogę zapytać, dlaczego „z pliku”?

W każdym razie: chcesz jakoś „zapisz” parametry i pokrewne rezultat dla niektórych połączeń funkcji. Prosty sposób, aby zrobić to w Pythonie jest użycie dekorator funkcji. Oto szybki i brudny przykład, wykorzystując globalną dict aby zapisać dane, które Cię interesują:

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)

Teraz masz zebrane dane, możesz robić, co chcesz z nimi.

To może być znacznie lepsze od kursu (tj unikając globalny saved_data, używając inspect.getargspecs(func)do bardziej równomiernego reprezentację zapisanych argumentów itp, ale powinno to przynajmniej na początek.

Uwaga: jeśli naprawdę chcesz „nazw opisujących wyjścia i parametry”, można przepisać dekorator tak, że te „zapisuje nazwy plików” zamiast rzeczywistej wartości, lub wygenerować tych nazw potem z zebranych wartości.

Odpowiedział 18/12/2018 o 12:41
źródło użytkownik

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