动态更新多输入函数

时间:2017-08-03 00:38:28

标签: python

我正在创建一个具有3个输入属性的类的程序。程序调用一个函数来创建许多这些对象,并根据对此问题不重要的其他一些标准给出输入。

当我进一步开发我的程序时,我可能想要为该类添加越来越多的属性。这意味着我必须找到我用来创建这些对象的函数的所有实例,并更改输入参数。

例如,我的程序可能包含以下许多内容:

 create_character(blue, pizza, running)

其中输入对应于角色最喜欢的颜色,食物和活动。稍后,我可能想要添加第四个输入,例如喜欢的电影,或者可能是第五个,第六个或第九十九个输入。

专业程序员是否有任何关于构造代码的建议,以便他们不必经历并单独更改create_character函数被调用的每一行,以便它现在具有新的,正确数量的输入? / p>

查找和替换似乎很好,但这使得错误成为可能,而且看起来也很单调乏味。我期待这个功能至少召唤50次。

3 个答案:

答案 0 :(得分:2)

我可以考虑一些选项,让你可以设计你的课程,以便以后更容易扩展新的"最喜欢的"的东西。

第一种方法是使大多数(或所有)参数可选。也就是说,您应该为每个值指定默认值(如果不是可以作为默认值应用的实际值,则可能为None)。这样,当你添加一个额外的参数时,调用没有new参数的函数的现有位置仍然有效,它们只会得到默认值。

另一种选择是使用容器(如字典)来保存值,而不是为每个容器使用单独的变量或参数。例如,在您的示例中,可以使用类似favorites = {'color': blue, 'food': pizza, 'activity': running}的字典表示字符的收藏夹(假设这些值在某处定义),然后您可以传递字典而不是单独的项目。如果您使用字典的get方法,也可以使此类设计使用默认值(favorites.get('movie')如果您还没有更新创建的代码,则会返回None要添加'movie'密钥的字典。)

答案 1 :(得分:1)

您可以利用argument/keyword argument unpacking来支持动态更改的函数参数。还有生成所需功能的工厂函数/类:

def create_character(required1, required2, *opt_args, **kwargs):
    """ create_character must always be called with required1 and required2
    but can receive *opt_args sequence that stores arbitrary number of
    positional args. kwargs hold a dict of optional keyword args """

    for i, pos_arg in enumerate(opt_args):
        # pos_arg walks opt_args sequence
        print "position: {}, value: {}".format(i+3, pos_arg)

    for keyword, value in kwargs:
        print "Keyword was: {}, Value was: {}".format(keyword, value)
pos_args = (1,2,3)
create_character('this is required','this is also required', *pos_args)
""" position: 3, value: 1
    position: 4, value: 2
    position: 5, value: 3 """
a_dict = {
    'custom_arg1': 'custom_value1',
    'custom_arg2': 'custom_value2',
    'custom_arg3': 'custom_value3'
}   

create_character('this is required','this is also required', **a_dict)
""" Keyword was: custom_arg2, value: custom_value2
    Keyword was: custom_arg3, value: custom_value3
    Keyword was: custom_arg1, value: custom_value1 """

答案 2 :(得分:0)

我非常喜欢列表或字典输入法,但它仍然很混乱并且允许出错的可能性。我最终做的是:

我将类对象更改为没有输入。首先为收藏夹分配随机,默认或未指定的选项。

创建类对象后,我编辑了对象的属性,如下所示:

{ 
    "_id" : ObjectId("59b035a9f5ec1e38a0e668be"), 
    "zipcode" : "10001", 
    "city" : "New York", 
    "state_full" : "New York", 
    "state" : "NY", 
    "county" : "New York", 
    "loc" : {
        "type" : "Point", 
        "coordinates" : [
            -73.9967, 
            40.7484
        ]
    }
}

我认为这种方法的缺点是它应该比直接输入变量慢。好处是,未来很容易改变。也许当程序完成后,将更有意义的是转换为@Blckknight的方法,并将输入作为列表或字典。