私はむしろPythonを初めて使っています。最近、私はPythonのクラス概念を検討していました。私が書いた2つのスクリプトでは、(ArcGisの方言で)SQLステートメントをまとめるクラスを定義すると便利だと思いました。本当に素晴らしいことはありません。ここに私が思いついたのがあります。私は2つのことを求めている:第一に、一般的な欠陥?改善のための提案?第二に、私は最後の関数def constructor
のコードにちょっと固執しています。実際には、リストではなく、辞書からタプルを返したいと思います。しかし、リストの理解はいいです。では、発電機はどうですか?私はそれを行う方法を正確に把握することはできません...リストの理解の代わりにジェネレータ?そして、どこでクラスを改善できますか?
class ArcSql:
type_book = {'str':("'","'"), 'int':("", "")}
format_book = dict(shp=("'","'"), GDB=("[","]"))
def __init__(self,colom_name, values_list, value_type = 'str', arc_format ='shp'):
self.colom = colom_name
self.values = values_list
self.valtype = self.constructor(type_book, value_type)
self.aformat = self.constructor(format_book, arc_format)
self.colom_formated = str(self.aformat[0][0]) + self.colom + str(self.aformat[0][1])
def statement(self):
temp_state = []
connector = "'OR' "
count_values = len(self.values)
if count_values == 0:
return("error, not enough values...")
else:
for v in self.values:
x = self.colom_formated + " = " + str(self.valtype[0][0]) + v + str(self.valtype[0][1]) + ' ' + connector
temp_state.append(str(x))
state = "".join(temp_state)[:-5]
return(str(state))
def constructor(self, book, book_key):
return([v for k,v in book.iteritems() if k==book_key])
: ' "%S%S%S" %(self.aformat [0:あなたはビット文字列置換を使用して' colom_formated'ラインを片付けることができ] [0]、self.colom、self.aformat [0] [1]) 'これは高速です。 'x = ...'行についても同じことが言えます。 'if count_values == 0:'を比較すると非常にpythonではありません - 'boolean([])'は 'False'に等しいので、' self.values'がその仕事をします。 'str()'へのすべての呼び出しはあまりにも過剰です - すでに文字列を扱っているので、それらを再度変換する必要はありません。 –
'return'はキーワードであり、関数ではありません(考えれば、どのようにそのような関数が実装されるのでしょうか?)ので、返すものの周りのかっこは不要です(そして、かなり醜いと見なされます)。また、行に対応すると仮定して、* column *と書かれています。 –
ありがとう、非常に有用な提案。私は個人的に文字列の置換が本当に好きではありませんが、コードを読みにくくすると思います。しかし、それは私のコーディング経験と関係しているかもしれません。とにかく、あなたの助けをありがとう、それは非常に感謝しています! – LarsVegas