我对Python很陌生。最近我在研究python的类概念。好吧,对于我编写的几个脚本,我认为定义一个将SQL语句放在一起的类(在ArcGis方言中)会很方便。没什么好看的。这就是我想出的。我问两件事:第一,一般缺陷?建议改进?其次,我对最后一个函数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])
答案 0 :(得分:4)
应该在codereview site中更好地询问您的第一个问题。
关于第二个问题,您可以按如下方式使用生成器:
def constructor(self, book, book_key):
for k, v in book.iteritems():
if k==book_Key:
yield v
...
for value in obj.constructor(book ,book_key):
# Do whatever you need with value
无论如何,我的理解是,在这种情况下,你只能从列表理解中得到一个结果:
def constructor(self, book, book_key):
return next(v for k, v in book.iteritems() if k==book_key, None)
...
value = obj.constructor(book ,book_key)
if value is not None:
# Do whatever you need with value
其中next
是一个内置函数,用于返回迭代器的下一个值或传递的默认值(在这种情况下为None
)如果迭代器已用尽(如果没有传递默认值,在这种情况下会引发例外情况。)
答案 1 :(得分:3)
您可以轻松地将列表理解更改为生成器,只需将[]
替换为()
,使其成为生成器,然后为生成器关键字{{1交换return
}}:
yield
现在应该只返回一个元组 - 如果你想要更多(作为列表),你需要调用yield (k,v in book.iteritems() if k==book_key)
。
答案 2 :(得分:1)
def constructor(self, book, book_key):
return([v for k,v in book.iteritems() if k==book_key])
如果book
是字典,则其键是唯一的。那么为什么要遍历这个dict来找到值?
为什么不:
def constructor(self, book, book_key):
return (book[book_key],)