add_constructor
ile ekleyebileceğim uygun bir yapıcı işlevinin nasıl tanımlanacağını anlamaya çalışmak için PyYAML kaynak kodunu okuyorum. Bu kodun şimdi nasıl çalıştığına dair oldukça iyi bir anlayışa sahibim, ancak hala SafeConstructor
'daki varsayılan YAML kurucularının jeneratörler olduğunu anlamıyorum. Örneğin, bu yöntem SafeConstructor
arasında construct_yaml_map
:PyYAML neden jeneratörler nesnelerini oluşturmak için kullanıyor?
def construct_yaml_map(self, node):
data = {}
yield data
value = self.construct_mapping(node)
data.update(value)
bir nesne saplama ve sadece deep=False
construct_mapping
geçirilir, düğümden veri ile doldurmak için aşağıdaki şekilde jeneratör BaseConstructor.construct_object
kullanılır anlamak:
if isinstance(data, types.GeneratorType):
generator = data
data = generator.next()
if self.deep_construct:
for dummy in generator:
pass
else:
self.state_generators.append(generator)
Ve construct_mapping
için deep=False
'un bulunduğu durumda verilerin BaseConstructor.construct_document
içinde nasıl üretildiğini anlıyorum. Anlamıyorum ne
def construct_document(self, node):
data = self.construct_object(node)
while self.state_generators:
state_generators = self.state_generators
self.state_generators = []
for generator in state_generators:
for dummy in generator:
pass
veri nesneleri dışarı stubbing ve construct_document
yılında jeneratörler üzerinde yineleme tarafından nesneler aracılığıyla aşağı çalışma yararı olduğunu. Bunun YAML spesifikasyonundaki bir şeyi desteklemek için yapılması gerekiyor mu, yoksa bir performans avantajı sağlıyor mu?
This answer on another question
biraz yardımcı oldu, ama o cevap neden yaptığını anlamıyorum bu: Ben ikinci formu için çalıştığını test ettikdef foo_constructor(loader, node):
state = loader.construct_mapping(node, deep=True)
return Foo(**state)
: bunun yerine
def foo_constructor(loader, node):
instance = Foo.__new__(Foo)
yield instance
state = loader.construct_mapping(node, deep=True)
instance.__init__(**state)
Diğer cevapta yayınlanan örnekler, ama belki de bazı kenar vakalarını kaçırıyorum.
PyYAML sürüm 3.10 kullanıyorum, ancak söz konusu kod PyYAML'nin en yeni sürümünde (3.12) aynı görünüyor.
Stackoverflow'a Hoş Geldiniz. – Randy