最好把generator.close()放在哪里?

use*_*030 -4 python generator python-3.x

我今天早上构建了这个类,它工作得很好而且很紧凑,但因为它是通过调用一个新的生成器来工作的,每次我担心我会在内存中留下一堆。我很乐意在yield 语句之后立即使用finally 来执行此操作。看起来会干净一点。

class Enter:
    def __init__(self,Entries, container=[], keyName = "Key", valueName = "Value"):
        self.Dict = {}
        self.Entries = Entries
        self.container = container
        self.keyName = keyName
        self.valueName = valueName

    def gen(self,dis):
            print(dis)
            yield input("Entry: ")

    def enter(self):
        for ea in range(self.Entries):
            print("\nPlease input a", self.keyName, "then a", self.valueName)
            x = next(self.gen("\nEnter a " + self.keyName + ":"))
            y = next(self.gen("\nEnter a " + self.valueName + ":"))
            self.Dict.update({x:y})
        retrun self.Dict

    def enterList(self):
        lst = []
        for ea in range(self.Entries):
            print("\nSome Message")
            x = next(self.gen("\nEnter: "))
            lst.append(x)
        if self.container == ():
            lst = tuple(lst)         
        return lst

Dictionary = Enter(Entries = 2, keyName = "First Name", valueName="LastName").enter()

print(Dictionary)

output = Enter(Entries = 3, container= () ).enterList()

print(output)
Run Code Online (Sandbox Code Playgroud)

pok*_*oke 5

每个生成器对象都有大量的开销用于管理状态和所有内容。除非您出于正确的原因需要发电机,否则您应该避免使用它们。就您而言,您只能生产一件物品,您的生成器无法生产更多物品,并且该价值可以立即免费获得。所以在这里使用生成器是完全错误的。

相反,您可以enter像这样高效地编写函数,而无需任何开销:

def enter(self):
    for ea in range(self.Entries):
        print("\nPlease input a", self.keyName, "then a", self.valueName)
        x = input("\nEnter a " + self.keyName + ":")
        y = input("\nEnter a " + self.valueName + ":")
        self.Dict[x] = y
    return self.Dict
Run Code Online (Sandbox Code Playgroud)