2012-02-07 67 views
0

最近我有一个想法,即编写一个模块将字典转换为有效的CSS代码。我想听听你对我的代码的评论。 许可证MIT,BSD等提高Python中代码模块质量的建议

的代码非常简单:

#pss.py 

__version__ = '1.0' 

class PSS: 
    def __init__(self, obj): 
     self.obj = obj 
     self.__data = {} 
     self.__parse(obj) 

    def __repr__(self): 
     return self.__build(self.obj) 

    def __build(self, obj, string = ''): 
     for key, value in sorted(self.__data.items()): 
      if self.__data[key]: 
       string += key[1:] + ' {\n' + ''.join(value) + '}\n\n' 

     return string 

    def __parse(self, obj, selector = ''): 
     for key, value in obj.items(): 
      if hasattr(value, 'items'): 
       rule = selector + ' ' + key 
       self.__data[rule] = [] 
       self.__parse(value, rule) 

      else: 
       prop = self.__data[selector] 
       prop.append('\t%s: %s;\n' % (key, value)) 

导入模块:

#test.py 

from pss import * 

css = PSS({ 
    'html': { 
     'body': { 
      'color': 'red', 
      'div': { 
       'color': 'green', 
       'border': '1px' 
      } 
     } 
    } 
}) 

print(css) 

结果:

html body { 
     color: red; 
} 

html body div { 
     color: green; 
     border: 1px; 
} 

所以我需要你的建议,以改进代码质量

+4

我想你应该在[coderiview](http://codereview.stackexchange.com/)上提问你的问题 – shenshei 2012-02-07 15:45:30

+0

为什么'PSS'类看起来非常像一个函数,它需要一个字典并返回一个字符串? – 2012-02-07 15:47:35

+0

@shenshe,谢谢你,我不知道那个 – 2012-02-07 15:47:55

回答

3
  1. 不要键入检查参数到__init__:调用者可能比你更清楚。例如,你期望有一个“字典”。我可能会传递给你一个字典的子类,或者其他一些映射协议的实现,你现在的代码会拒绝它。
  2. 不要像这样使用__names,这很烦人。了解Python文化,您不必尝试隐藏数据。 Python确实没有一个防弹的方法来隐藏数据,所以不要尝试。
  3. self.__data[i].__len__()只不过是len(self.__data[i])if len(xx):只能是if xx:。不知道为什么你认为__len__是比len更Pythonic。通常,用户代码不会调用dunder方法,它们是为Python提供的,可以代表您进行调用。
  4. 您的repr可能不应该与您的输出相同。 repr用于在调试环境中显示对象。
  5. 我不明白如何得到你的班的输出。 Repr似乎是唯一的公共途径,这很奇怪。至少使其成为__str__方法。
  6. prop.insert(prop.__len__(), x)只是prop.append(x)
  7. 字符串格式化比增加串起来更容易,更可读:'\t%s: %s\n' % (i, obj[i])
+0

'1.'我真的一直认为它是一个好的做法来检查传入的参数。 '2。为什么不能和另外一种简单的方法(嵌套函数除外)来隐藏本地数据? '3'我知道'len()',但我认为'__len __()'是更多的Python方式)。 '4'我经常在许多专业应用中看到这种技术。 – 2012-02-07 15:54:58

+1

我已经回答了上面的这些... – 2012-02-07 15:57:47

+0

好吧,我会尽力满足您的意见。也许还有哪些地方可以做得更容易? – 2012-02-07 16:05:11

2

我建议使用pylint,它会指出你的代码风格的缺陷。除此之外,只要你保持你的代码尽可能简单和可读,这只是一个偏好问题。

+0

哦,我忘了这个工具的全部 – 2012-02-07 16:00:23