相关疑难解决方法(0)

namedtuple和可选关键字参数的默认值

我正在尝试将一个冗长的空洞"数据"类转换为一个命名元组.我的班级目前看起来像这样:

class Node(object):
    def __init__(self, val, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right
Run Code Online (Sandbox Code Playgroud)

转换为namedtuple它后看起来像:

from collections import namedtuple
Node = namedtuple('Node', 'val left right')
Run Code Online (Sandbox Code Playgroud)

但这里有一个问题.我的原始类允许我传入一个值,并使用命名/关键字参数的默认值来处理默认值.就像是:

class BinaryTree(object):
    def __init__(self, val):
        self.root = Node(val)
Run Code Online (Sandbox Code Playgroud)

但是这对我重构的名为元组的情况不起作用,因为它希望我传递所有字段.当然,我可以代替的出现Node(val)Node(val, None, None),但它不是我的胃口.

所以确实存在着一个很好的技巧,它可以使我重新写成功无需添加大量的代码复杂度(元编程),或者我应该只吞下药丸,并与"查找和替换"继续前进?:)

python default-value optional-arguments namedtuple

265
推荐指数
11
解决办法
9万
查看次数

用动态成员定义枚举的更 Pythonic 方式

我需要创建一个枚举来表示 ISO 国家/地区代码。国家/地区代码数据来自 json 文件,可从以下位置获取:https ://github.com/lukes/ISO-3166-Countries-with-Regional-Codes

所以我所做的是:

data = json.load(open('slim-2.json'))
codes_list = [(data[i]['alpha-2'], int(data[i]['country-code']))
              for i in range(len(data))]

CountryCode = enum.Enum('CountryCode', codes_list,)

names_dict = {int(data[i]['country-code']):data[i]['name'] 
              for i in range(len(data))}
setattr(CountryCode, '_names', names_dict)

CountryCode.choices = classmethod(lambda cls:((member.value, name) 
                                  for name, member in cls.__members__.items()))
setattr(CountryCode, '__str__' ,lambda self: self.__class__._names[self.value])
Run Code Online (Sandbox Code Playgroud)

坦率地说,这段代码片段很丑陋。我研究了定义枚举类的替代方法,但无法拼凑出解决方案。有没有一种方法可以按以下形式定义枚举:

class CountryCode(enum.Enum):

    data = json.load(open('slim-2.json'))
    # Some code to define the enum members

    @classmethod
    def choices(cls):
    # etc...
Run Code Online (Sandbox Code Playgroud)

关于如何执行此操作有什么建议吗?

python enums python-3.x

6
推荐指数
2
解决办法
8305
查看次数