Метод получения Python с одной строкой или ссылочными атрибутами - PullRequest
0 голосов
/ 26 ноября 2018

Скажем, у меня есть класс python, который может создать словарь при создании экземпляра:

class myClass():
    def __init__(self, some_dict=None):
        self.some_dict = some_dict

, а затем в другом месте в моем коде, я хочу найти ключ в этом слове - но, конечно, толькоесли это существует.Является ли лучший стиль Python для 1) создания «метода проверки» в классе, даже если он содержит только одну строку, или 2) прямой ссылки на атрибут словаря класса?Скажем, класс был создан как myClassInstance, тогда параметры

1) Метод класса:

    def is_key_in_dict(self, query_key):
        return self.some_dict and query_key in self.some_dict

, который затем используется как

if myClassInstance.is_key_in_dict(query_key):
    do_something()

или2) прямая ссылка в коде, где он используется.

if myClassInstance.some_dict and query_key in myClassInstance.some_dict:
    do_something()

Можно ли (по стилю) ссылаться на атрибуты класса напрямую или считается плохой / небезопасной практикой?Я немного знаком с декоратором @property, о котором говорилось в этом посте: Какой питонный способ использовать геттеры и сеттеры? , но не уверен, что это отвечает на мой вопрос.

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Может быть, вам нужен объект .__ содержит __ метод

class SomeClass:
    def __init__(self, some_dict):
        self.some_dict = some_dict or {}

    def __contains__(self, item):

        if item in self.some_dict:
            return True

        return False

И в вашем коде

c = SomeClass({'a': 1})

if 'a' in c:
    print('c contains key "a"')
0 голосов
/ 26 ноября 2018

Согласно EAFP-Принципу , использование исключений для потока управления является питоническим.В настоящее время вы смотрите перед тем, как прыгнуть.

Я бы написал (либо как функцию, либо как метод):

def do_something(myClassInstance, query_key): # additional arguments omitted
    try:
        query_value = myClassInstance.some_dict[query_key]
    except TypeError, KeyError: # could also consider AttributeError
        pass # or whatever logic you need
    else: # no exception
        # code that does something

Если у вас есть несколько функций / методов, которые требуют одинаковой обработки исключений,для повторного использования было бы целесообразно написать дополнительную оболочку вокруг обработки исключений, которая возвращает query_value, если исключение не произошло, и соответствующее значение стража (например, None), если возникло исключение.

Вы также можете использовать строку

self.some_dict = some_dict or {}

в __init__, тогда вам больше не придется думать о TypeError s.

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