[英]How can python __new__ method return a string or unicode object instead of class object
[英]How to return with a python method A NEW class object?
我對以下不起作用的代碼有一些疑問:
__init__
可以將模式和list
作為參數(這是一個字典list
- 我在哪里搜索)? 在此先感謝您的幫助。
class DataBase():
# Searches Movies by title and gives its entire info :( (stupid)
def __init__(self, movies, schema):
pass
def search(self, field_name, field_value1, field_value2=None):
if field_name=='title':
mov=[]
for movie in movies:
if field_value1 == movie['movie_title']:
mov.append(movie)
return mov
if field_name=='year':
for movie in movies:
if field_value2:
if movie['title_year'] in range (field_value1, field_value2+1):
return movie['movie_title'],movie['title_year']
else:
if movie['title_year']==field_value1:
return movie['movie_title'],movie['title_year']
if field_name=='actor_1_name':
mov=[]
for movie in movies:
if field_value1 == movie['actor_1_name']:
mov.append(movie)
return mov
**strong text**
目前還不清楚你要做什么,如果沒有輸入和期望結果的例子,很難解釋,但這可能很接近。
class DataBase():
def __init__(self, movies, schema):
self.movies = movies
self.schema = schema
def search(self, field_name, field_value1, field_value2=None):
search_result = []
for movie in self.movies:
if field_value2:
if movie[field_name] in range((field_value1, field_value2+1)):
search_results.append(movie)
else:
if movie[field_name] == field_value1:
search_results.append(movie)
return DataBase(search_results, self.schema)
您甚至可能希望簡化搜索中的比較。 你可以為(兩種)不同類型的比較定義輔助函數; 根據參數選擇要使用的比較; 然后在搜索中使用所選的功能。
...
def search(self, field_name, field_value1, field_value2=None):
# comparison types
def range_comparison(movie, start=field_value1, end=field_value2):
return movie[field_name] in range(start, end+1)
def equality_comparison(movie, name=field_value1):
return movie[field_name] == name
# which comparison to use
comparison = range_comparison if field_value2 else equality_comparison
search_result = []
for movie in self.movies:
if comparison(movie):
search_results.append(movie)
# or
# search_results = [movie for movie in movies if comparison(movie)]
return DataBase(search_results, self.schema)
由於某種原因,它吸引我,因為它將比較類型的邏輯與實際搜索分開。
它不會將search_results
視為空 - 未找到電影。
DataBase
對象調用DataBase(movies, schema)
,其中movies
和schema
是類的__init__()
方法的參數。 __init__()
可以根據需要使用盡可能多的位置參數,但是記得將它們的對象分配給__init__()
體內的適當名稱,以便以后可以使用它們(請參閱我的類中的__init__()
方法)。 search()
方法中重復搜索模式,只需使用field
參數作為匹配數據庫中每條記錄的鍵,並在兩種情況下拆分問題:一個用於范圍搜索,另一個用於純搜索(參見下面的search()
方法)。 請記住解決不匹配的情況:在我的實現中,我只返回一個空的DataBase
對象。 您還應該解決無效搜索鍵的情況:在我的實現中,我返回None
。 下面的test()
函數提供了一個數據庫和三個搜索,既簡單又在一個范圍內。
您應該將collections.namedtuple
視為數據庫記錄的替代表示。
class DataBase():
def __init__(self, movies, schema):
self.movies, self.schema = movies, schema
def __str__(self):
return str(self.movies)
def search(self, field, from_value, to_value=None):
if field in self.schema:
matches = []
if to_value:
for movie in self.movies:
if movie[field] in range(from_value, to_value):
matches.append(movie)
else:
for movie in self.movies:
if movie[field] == from_value:
matches.append(movie)
return DataBase(matches, self.schema)
else:
return None
def test():
schema = [ "title", "year", "rating" ]
movies = [
{ "title":"Star Wars: The Empire Strikes Back", "year":1980, "rating":3 },
{ "title":"Serenity", "year":2005, "rating":5 },
{ "title":"Scarface", "year":1983, "rating":4 },
{ "title":"Harry Potter and the Philosopher's Stone", "year":2001, "rating":2 },
]
db = DataBase(movies, schema)
print(db.search("title", "Scarface"))
print(db.search("year", 2000, 2008))
print(db.search("rating", 4, 6))
print(db.search("title", "The Last Emperor"))
print(db.search("invalid", "value"))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.