这是python中方法属性的合理使用吗?
我有许多不同的python文件,每个文件都有许多不同的方法。这些方法中的每一个都执行一些任务,我想用一个文件名保存该任务的结果,该文件名描述该方法的输出和参数。我目前的想法是,对于每个方法,都有一个带有return\u name:file\u name结构的字典,保存为方法属性,例如这是python中方法属性的合理使用吗?,python,Python,我有许多不同的python文件,每个文件都有许多不同的方法。这些方法中的每一个都执行一些任务,我想用一个文件名保存该任务的结果,该文件名描述该方法的输出和参数。我目前的想法是,对于每个方法,都有一个带有return\u name:file\u name结构的字典,保存为方法属性,例如 def addNumbers(number_1, number_2): addNumbers.filename_dictionary = { "number1": "number1_" +
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",
}
一些问题:这个想法有没有根本性的缺陷?是否有其他模式可以以更标准的方式解决此问题?实际问题是定义不清还是没有意义
谢谢您的帮助。好的,让我们忘掉您的示例代码,只需稍微重新表述一下您的主要问题陈述: 我有许多不同的python文件,每个文件都有许多不同的函数。我想用一个描述输出和参数的文件名保存这些函数的结果 出于好奇,我可以问一下为什么要用文件名吗 无论如何:您希望以某种方式保存某些函数调用的参数和相关结果。在Python中实现这一点的简单方法是使用函数装饰器。下面是一个快速而肮脏的示例,使用全局dict保存您感兴趣的数据:
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)
现在你已经收集了你的数据,你可以用它们做任何你想做的事情
当然,这可以大大改进,即避免全局保存的_数据,使用inspect.getargspecsfunc更统一地表示保存的参数等,但这至少应该让您开始
注意:如果您确实想要文件名来描述输出和参数,您可以重写decorator,使其保存这些文件名而不是实际值,或者从收集的值生成这些文件名。我不清楚为什么需要字典以及打算如何使用它?当我想保存方法的输出时,我想获得字典中定义的文件名。所以,当我想让文件名保存addNumbers.filename\u dictionary时,我会调用addNumbers.filename\u dictionary。请注意,这些是函数,而不是属于类的方法。哦,谢谢你的区别-我以前不知道这一点。谢谢你,我之前不知道decorators。文件名只是我的模式用例,你是对的,我可以重写装饰器或在以后生成它们?我试图删除它,但输出没有任何改变。@eygrr它使save成为一个行为良好的装饰器-保留装饰函数的名称和docstring-如本文所述