- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我需要一个类似于 namedtuple
的类型,但具有可更改的字段。 namedlist
的行为应如下:
Something = namedlist('Something', ['a', 'b'])
st = Something(123, 456)
print st # Something(a=123, b=456)
a, b = st
print a, b, st.a, st.b # 123 456 123 456
st.a = 777
print st # Something(a=777, b=456)
st.b = 888
print st # Something(a=777, b=888)
在了解了一些关于描述符 here 和 there 的知识后,我得到了以下代码,如上所述:
class IndexAccessor(object):
def __init__(self, index):
self.index = index
def __get__(self, instance, owner):
return list.__getitem__(instance, self.index)
def __set__(self, instance, value):
list.__setitem__(instance, self.index, value)
def namedlist(classname, fields):
def init(self, *args):
list.__init__(self, args)
def repr(self):
return '%s(%s)' % (self.__class__.__name__, ', '.join(['%s=%s' % (k,list.__getitem__(self, i)) for i, k in enumerate(self._fields)]))
attrs = {'_fields': tuple(fields),
'__init__': init,
'__repr__': repr
}
for index, field in enumerate(fields):
attrs[field] = IndexAccessor(index)
return type(classname, (list,), attrs)
IndexAccessor
类对我来说有点像样板,所以我想知道是否可以改进代码来避免它。
我尝试用此替换 for index, field in enumerate(fields)
循环
for index, field in enumerate(fields):
def get(self):
return list.__getitem__(self, index)
def set(self, v):
list.__setitem__(self, index, v)
attrs[field] = property(get, set, None, 'Property "%s" mapped to item %d' % (field, index))
...但这导致 print a, b, st.a, st.b
语句生成 123 456 456 456
而不是 123 456 123 456
,我怀疑这与索引
未按要求工作有关。
奖励积分还可以提供简洁的代码以允许在构造函数中进行基于名称的分配,如下所示
Something = namedlist('Something', ['a', 'b'])
st = Something(a=123, b=456)
最佳答案
for 循环不起作用的原因是 get
和 set
函数中引用的 index
变量没有被复制。它是对在 for 循环中设置的 index
变量的引用。因此所有属性访问都会获取最后一个值。这可以通过显式地将索引存储为默认参数来解决。
固定代码:
for index, field in enumerate(fields):
def get(self,index=index):
return list.__getitem__(self, index)
def set(self, v,index=index):
list.__setitem__(self, index, v)
attrs[field] = property(get, set, None, 'Property "%s" mapped to item %d' % (field, index))
要允许关键字参数,请将 __init__
函数修改为以下内容:
def init(self, *args, **kwargs):
kwargs.update(zip(self._fields, args))
args = [kwargs[k] for k in self._fields]
list.__init__(self, args)
关于python - 受 `namedlist` 启发改进我的 `namedtuple` 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33469041/
我想形成一个 NamedList 对象,如下所示: response={numFound=57279026,start=0,docs=[SolrDocument{timestamp_update=Th
我一直在使用 namedlist 创建轻量级类: from namedlist import namedlist # create a class SomeClass = namedlist('Som
背景 我需要一个类似于 namedtuple 的类型,但具有可更改的字段。 namedlist 的行为应如下: Something = namedlist('Something', ['a', 'b'
我们使用了 Solr,我们希望通过使用 SolrJ 从 Solr 获取 SpellCheck.collate。 SolrQuery query = new SolrQuery(q); q
我是一名优秀的程序员,十分优秀!