Как вернуть с помощью метода python НОВЫЙ объект класса? - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть несколько вопросов относительно неработающего кода ниже:

  1. Как сделать, чтобы поиск метода возвратил объект New Database?
  2. Может ли __init__ принять в качестве аргумента схему и list (то есть list словарей - где я делаю поиск)?
  3. Как избежать написания подобной функциив методе поиска снова и снова, потому что в базе данных много имен полей.

Заранее спасибо за вашу помощь.

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**

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018
  1. Чтобы вернуть DataBase объектный вызов DataBase(movies, schema), где movies и schema - параметры метода __init__() класса.
  2. __init__() может приниматьстолько позиционных параметров, сколько вы хотите, но не забудьте назначить их объект соответствующим именам внутри тела __init__(), чтобы вы могли использовать их позже (см. метод __init__() в моем классе).
  3. Комуизбегайте повторения шаблона поиска по всему методу 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"))
0 голосов
/ 27 ноября 2018

Не совсем понятно, что вы пытаетесь сделать, и трудно интерпретировать без примера входов и желаемого результата, но это может быть близко.

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)

Возможно, вы даже захотите упростить сравнения в поиске.вы можете определить вспомогательные функции для (двух) различных типов сравнений;выбрать, какое сравнение использовать на основе аргументов;затем используйте в поиске функцию selected .

...

    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 пусто - фильмы не найдены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...