可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I'm trying to do the following: After performing a regex group search, I'm trying to assign the results to the class properties by a specific order. the number of results from the regex search varies from 1-5 values.
class Classification(): def __init__(self, Entry): self.Entry = Entry self.Section = '' self.Class = 'Null' self.Subclass = 'Null' self.Group = 'Null' self.Subgroup = 'Null' def ParseSymbol(self,regex): Properties_Pointers = [self.Section,self.Class,self.Subclass,self.Group,self.Subgroup] Pattern_groups = re.search(regex, self.Symbol) i = 0 for group in Pattern_groups.groups(): Properties_Pointers[i] = group i += 1
the problem is that for each loop iteration, instead of the class property, Properties_Pointers[i]
gets the property's value (and of course in this case I can't assign the desired value to the property).
thanks.
回答1:
Refer to attribute names instead, and use the setattr()
function to store a new value on self
:
def ParseSymbol(self, regex): attributes = ['Section', 'Class', 'Subclass', 'Group', 'Subgroup'] Pattern_groups = re.search(regex, self.Symbol) for group, attr in zip(Pattern_groups.groups(), attributes): setattr(self, attr, group)
setattr()
lets you set attributes based on a variable, here taking from attributes
; there is also a companion getattr()
function to retrieve attributes dynamically.
回答2:
setattr()
will set the attributes of an object based on a string name. You can rewrite ParseSymbol
above:
def ParseSymbol(self,regex): Properties_Pointers = ['Section','Class','Subclass','Group','Subgroup'] Pattern_groups = re.search(regex, self.Symbol) i = 0 for group in Pattern_groups.groups(): setattr(self, Properties_Pointers[i], group) i += 1
As a side note, you can iterate over both Pattern_groups.groups()
and Pattern_Pointers
simultaneously by using zip()
. This cleans up the code by removing the index variable i
and its incrementation:
for pointer, group in zip(Properties_Pointers, Pattern_groups.groups()): setattr(self, pointer, group)
回答3:
If you know that your regex will always contain the same number of groups, you can just use tuple unpacking:
self.Section, self.Class, self.Subclass,self.Group, self.Subgroup = Pattern_groups.groups()