gpt4 book ai didi

python - 处理具有作为参数给定的大量属性的对象的正确/Pythonic 方法

转载 作者:行者123 更新时间:2023-11-28 19:18:06 25 4
gpt4 key购买 nike

<分区>

我遇到这样一种情况,一个对象有 15 个以上的参数,其中一些是必需的/可选的/有默认值/没有默认值。假设类(class)是Foo参数是 Bar1 , Bar2 , ..., BarN .

我可以像这样编写类(class):

  1. 传统的、乏味的方式。易于定义默认值和冗长。但是,代码会很长并且有很多重复。

    class Foo(object):
    def __init__(self, bar1, bar2,...barN='somedefault' ):
    self.bar1 = bar1
    self.bar2 = bar2
    ...
    self.barN = barN
  2. 滥用(?)kwargs .不支持默认值。

    class Foo(object):

    fields = [ 'bar1', 'bar2', ...n 'barN']

    def __init__(self, **kwargs ):
    for key in kwargs:
    if key in self.fields:
    setattr(self, key, kwargs[key])
    else:
    raise Exception('invalid attribute: {0}'.format(key))

对于数字 2,我可能会更改 fields类属性到映射 { 'attribute_name': 'default_value' }然后分配 default_value如果该 key 不在 kwargs 中.

我工作的背景是我正在创建与服务器、防火墙规则、存储磁盘等相对应的对象,这些对象具有很多属性。在很多情况下,我从 API 获取属性,因此我可以执行第 2 项(即使没有验证)。但是,有时用户会创建防火墙规则,将其附加到服务器并将其发送到 API(带有 JSON 正文的 POST)。

是否有一些标准/pythonic 方法来处理具有大量属性的对象? #2 中的方法看起来不错,还是我真的应该采用冗长的#1 方法?

编辑:一个具体示例是具有以下参数的防火墙规则对象:

    action
destination_address_end
destination_address_start
destination_port_end
destination_port_start
direction
family
icmp_type
position
protocol
source_address_end
source_address_start
source_port_end
source_port_start

现在我倾向于这样的事情:

class FirewallRule(object):

attributes = {
'action': 'default_value',
'destination_address_end': 'default_value',
'destination_address_start': 'default_value',
'destination_port_end': 'default_value',
'destination_port_start': 'default_value',
'direction': 'default_value',
'family': 'default_value',
'icmp_type': 'default_value',
'position': 'default_value',
'protocol': 'default_value',
'source_address_end': 'default_value',
'source_address_start': 'default_value',
'source_port_end': 'default_value',
'source_port_start': 'default_value'
}

def __init__(self, **kwargs ):
for key in kwargs:
valur_or_default = kwargs.get(key, attributes[key])
setattr(self, key, valur_or_default)

(在生产代码中,我显然会添加更好的错误处理和验证)

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com