如何解决函数之间丢失的python3weakref类迭代器
我在this post实现了weakref()
函数之后,在python3.8中实现了一个可迭代的类,以便能够删除该类的元素,如该帖子的公认答案所述。
问题在于,如果我将一个可迭代的类填充到一个函数中,我将无法对其元素进行迭代:
#! /usr/bin/env python3.8
import sys
import weakref
# from memory_profiler import profile
# IN = "/home/enrico/DropBox/NY/asilo_variant/inputs/merged.idter_M.norm.PASS.filtered.head1k.VEPoutput.vcf"
a = [ "a","b","c","d" ]
class VEPh_iterator(type):
def __iter__(self):
return self.classiter()
class VEPh:
'''
this stores VEP header and relative column numbers and chars
'''
__Metaclass__ = VEPh_iterator
by_id = {}
def __init__(self,id,column_number):
self.id = id
# self.by_id[id] = self
self.by_id[id] = weakref.ref(self)
self.column_number = column_number
@classmethod
def classiter(cls):
# return iter(cls.by_id.values())
return (i for i in (i() for i in cls.by_id.values()) if i is not None)
def readVCF( ):
name_dict = {}
for i,s in enumerate(a) :
name_dict.update({ i : s })
name_dict[i] = VEPh( s,i )
if __name__ == "__main__" :
readVCF( )
for v in VEPh.classiter():
print( " - " + v.id + " : " + str(v.column_number) )
python3.8 /home/enrico/DropBox/NY/asilo_variant/asilo_variant.stackoverflow.py
### NO STDOUT
#! /usr/bin/env python3.8
import sys
import weakref
# from memory_profiler import profile
# IN = "/home/enrico/DropBox/NY/asilo_variant/inputs/merged.idter_M.norm.PASS.filtered.head1k.VEPoutput.vcf"
a = [ "a",column_number):
self.id = id
self.by_id[id] = self
# self.by_id[id] = weakref.ref(self)
self.column_number = column_number
@classmethod
def classiter(cls):
return iter(cls.by_id.values())
# return (i for i in (i() for i in cls.by_id.values()) if i is not None)
def readVCF( ):
name_dict = {}
for i,i )
if __name__ == "__main__" :
readVCF( )
for v in VEPh.classiter():
print( " - " + v.id + " : " + str(v.column_number) )
称之为有效:
python3.8 /home/enrico/DropBox/NY/asilo_variant/asilo_variant.stackoverflow.py
- a : 0
- b : 1
- c : 2
- d : 3
我猜问题是weakref()
在函数之间以某种方式丢失了,但是如何使它可以被外部函数调用?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。