微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

函数之间丢失的python3weakref类迭代器

如何解决函数之间丢失的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) )

调用它有一个空的OUT:

python3.8 /home/enrico/DropBox/NY/asilo_variant/asilo_variant.stackoverflow.py

### NO STDOUT

如果修改删除weakref(),则可以使用:

#! /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 举报,一经查实,本站将立刻删除。