2012-02-07 17 views
0

最近、辞書を有効なCSSコードに変換するモジュールを書く考えがありました。私のコードについてのあなたのコメントを聞きたいと思います。 BSDなど ライセンスMIT、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

+0

なぜ 'PSS'は辞書を取り、文字列を返す関数によく似ていますか? –

+0

@shenshe、ありがとう、ありがとう、私はそのことについて知らなかった –

答えて

3
  1. 引数をタイプチェックしないでください。__init__:発信者があなたよりよく知っているかもしれません。たとえば、 "dict"が必要です。私はdictのサブクラス、またはマッピングプロトコルの他の実装を渡すかもしれません。あなたの現在のコードはそれを拒否します。
  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はデバッグコンテキストでオブジェクトを表示するためのものです。
  5. クラスの出力を取得する方法がわかりません。 Reprは唯一の公的な方法だと思われますが、これは非常に奇妙です。少なくとも__str__メソッドにしてください。
  6. prop.insert(prop.__len__(), x)は、ちょうどprop.append(x)です。
  7. 文字列の書式は、一緒に文字列を追加するより簡単に、より読みやすいです:私はpylintを使用することをお勧めします'\t%s: %s\n' % (i, obj[i])
+0

' '私はいつもそれが入ってくる議論をチェックする良い練習。 '2'なぜローカルデータを隠すための簡単な方法(ネストされた関数を除く)がありますか? '3'私は 'len()'について知っていますが、 '__len __()'はもっとPythonの方法だと思います。 '4'私はしばしば多くの専門的なアプリケーションでこのテクニックを見ます。 –

+1

私はこれらに上記で答えました... –

+0

まあ、私はあなたのコメントに対応しようとします。おそらく、まだ簡単にできる場所がありますか? –

2

、それはあなたのコードスタイルの欠陥を指摘します。それ以外の場合は、コードをできるだけ単純で読みやすいものにしておけば、それは好みの問題です。

+0

ああ、私はこのツールについてのすべてを忘れてしまった –

関連する問題