我目前正在使用PyQt绑定在Python中编写我的第一个开源Qt应用程序。编码时我注意到了一些习惯,这可能会影响我的代码的可读性。具体来说,我有这些顾虑:
因为我不希望有一个无限的函数列表,而装饰器用几百行填充我的所有类,所以我自己做了一个模板,使每个(PyQt-)属性适合一行代码从而将PEP-8完全扔出窗外并将其埋在六英尺以下:
propertyName = pyqtProperty(QVariant,fget=lambda self:QVariant(functionThatGetsThePropertyValue()),fset=lambda self,x:[defaultFunc1(),defaultFunc2(),] if x is None else [None for (variableToSet1,variableToSet2,) in ((x,otherInputVariables_inThisCaseOnlyX),) for _ in (functionToCall1(x),functionToCall2(x),)] )
以下是一些例子:
styleRules = pyqtProperty(QVariant,fget=lambda self:QVariant(self.styleSheet() ),fset=lambda self,x:[self.setProperty('styleRules','')] if x is None else [None for _ in (self.setStyleSheet(Helper.styleSheetDictToString(Helper.updateStyleSheet(self.styleSheet(),x))))] )
handle1Style = pyqtProperty(QVariant,fget=lambda self:QVariant(self.splitter.handle(1).styleSheet()),fset=lambda self,x:[self.setProperty('handle1Style','background-color:rgba(0,0,0,0)')] if x is None else [None for (self.settings['handle1Style' ],) in ((x,),) for _ in (self.splitter.handle(1).setStyleSheet(x),) ] )
handle2Style = pyqtProperty(QVariant,fget=lambda self:QVariant(self.splitter.handle(2).styleSheet()),fset=lambda self,x:[self.setProperty('handle2Style','background-color:rgba(0,0,0,0)')] if x is None else [None for (self.settings['handle2Style' ],) in ((x,),) for _ in (self.splitter.handle(2).setStyleSheet(x),) ] )
handle3Style = pyqtProperty(QVariant,fget=lambda self:QVariant(self.splitter.handle(3).styleSheet()),fset=lambda self,x:[self.setProperty('handle3Style','background-color:rgba(0,0,0,0)')] if x is None else [None for (self.settings['handle3Style' ],) in ((x,),) for _ in (self.splitter.handle(3).setStyleSheet(x),) ] )
keywordCollapsible = pyqtProperty(QVariant,fget=lambda self:QVariant(self.splitter.isCollapsible(1) ),fset=lambda self,x:[self.setProperty('keywordCollapsible',False) ] if x is None else [None for (self.settings['keywordCollapsible'],) in ((True if x=='true'else False,),) for _ in (self.splitter.setCollapsible(1,True if x=='true'else False),) ] )
controlCollapsible = pyqtProperty(QVariant,fget=lambda self:QVariant(self.splitter.isCollapsible(3) ),fset=lambda self,x:[self.setProperty('controlCollapsible',False) ] if x is None else [None for (self.settings['controlCollapsible'],) in ((True if x=='true'else False,),) for _ in (self.splitter.setCollapsible(3,True if x=='true'else False),) ] )
splitterSizes = pyqtProperty(QVariant,fget=lambda self:QVariant(tuple(self.splitter.sizes()) ),fset=lambda self,x:[self.setProperty('splitterSizes',(0,0,0,0)) ] if x is None else [None for (self.settings['splitterSizes' ],) in ((x,),) for _ in (self.splitter.setSizes(x),) ] )
这是
将此与更符合PEP-8的人进行对比:
@pyqtProperty(QVariant)
def styleRules(self):
return self.styleSheet()
@styleRules.setter
def styleRules(self,x):
if x is None:
self.setProperty('styleRules','')
else:
self.setStyleSheet(Helper.styleSheetDictToString(Helper.updateStyleSheet(self.styleSheet(),x)))
@pyqtProperty(QVariant)
def handle1Style(self):
return self.splitter.handle(1).styleSheet()
@handle1Style.setter
def handle1Style(self):
if x is None:
self.setProperty('handle1Style','background-color:rgba(0,0,0,0)')
else:
self.settings['handle1Style'] = x
self.splitter.handle(1).setStyleSheet(x)
@pyqtProperty(QVariant)
def handle2Style(self):
return self.splitter.handle(2).styleSheet()
@handle2Style.setter
def handle2Style(self):
if x is None:
self.setProperty('handle2Style','background-color:rgba(0,0,0,0)')
else:
self.settings['handle2Style'] = x
self.splitter.handle(2).setStyleSheet(x)
@pyqtProperty(QVariant)
def handle3Style(self):
return self.splitter.handle(3).styleSheet()
@handle3Style.setter
def handle3Style(self):
if x is None:
self.setProperty('handle3Style','background-color:rgba(0,0,0,0)')
else:
self.settings['handle3Style'] = x
self.splitter.handle(3).setStyleSheet(x)
@pyqtProperty(QVariant)
def keywordCollapsible(self):
return self.splitter.isCollapsible(1)
@keywordCollapsible.setter
def keywordCollapsible(self):
if x is None:
self.setProperty('keywordCollapsible', False)
else:
self.settings['keywordCollapsible'] = True if x == 'true' else False
self.splitter.setCollapsible(1,True if x == 'true' else False)
@pyqtProperty(QVariant)
def controlCollapsible(self):
return self.splitter.isCollapsible(3)
@controlCollapsible.setter
def controlCollapsible(self):
if x is None:
self.setProperty('controlCollapsible',False)
else:
self.settings['controlCollapsible'] = True if x == 'true' else False
self.splitter.setCollapsible(3,True if x == 'true' else False)
@pyqtProperty(QVariant)
def splitterSizes(self):
return tuple(self.splitter.sizes())
@splitterSizes.setter
def splitterSizes(self):
if x is None:
self.setProperty('splitterSizes',(0,0,0,0))
else:
self.settings['splitterSizes'] = x
self.splitter.setSizes(x)
我的风格是否可以接受,还是应该切换到更详细的版本?如果是这样,为什么?
我倾向于为我使用的每个Qt对象创建子类。我只想从小部件内部定义我的小部件的属性和属性,而不是让父级完成所有工作。
我怎么知道,是否对特定实例进行子类化是否合适?什么时候它有自己的方法,属性,事件处理程序?当我知道我将创建新类的多个实例时,我是否应仅子类,或者为了审美目的而这样做是否可以接受?
因为我创建了很多类,所以我将它们组合在父类中,尽管我听说人们不鼓励使用嵌套的Python类,因为它们没有真正的用途。有没有其他理由不这样做,或者是否可以将这些类分组,仅仅是为了将它们分组?