这是python中方法属性的合理使用吗?

时间:2018-12-18 11:11:29

标签: python

我有许多不同的python文件,每个文件都有许多不同的方法。这些方法中的每一个都执行某项任务,我想用一个描述该方法的输出和参数的文件名保存该任务的结果。我目前的想法是,对于每种方法,都有一个带有return_name:file_name结构的字典,并保存为方法属性,例如

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

这样做的基本动机是我希望将与该方法相关的所有信息保留在其中,因此,如果我想更改文件名,这将很容易。我想到的另一种方法是拥有一个名称相似的方法,该方法仅返回字典,但这似乎是一种更方便的方法。

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

一些问题:这个想法有根本的缺陷吗?是否有其他模式可以更标准地解决此问题?实际问题定义不明确还是没有道理?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

好吧,让我们忘记示例代码,只坚持主要的问题陈述(略作措辞):

  

我有许多不同的python文件,每个文件具有许多不同的功能。我想用描述输出和参数的文件名保存这些函数的结果。

出于好奇,请问为什么要“使用文件名”?

无论如何:您想以某种方式“保存”某些函数调用的参数和相关结果。在Python中执行此操作的简单方法是使用函数装饰器。这是一个简单快捷的示例,使用全局字典来保存您感兴趣的数据:

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)

现在,您已经收集了数据,您可以对它们进行任何操作。

这当然可以大大改善(例如,避免使用全局saved_data,使用inspect.getargspecs(func)对保存的参数进行更统一的表示等,但这至少可以帮助您入门。) >

注意:如果您确实想要“描述输出和参数的文件名”,则可以重写装饰器以保存这些“文件名”,而不是实际值,或者随后从收集的值中生成这些文件名。

>