• Как правильно организовать наследование?

    @Bright144
    я ни когда не занимался асинхронным программированием. Нельзя ли сделать так? Конечно после этого ты не можешь получить доступ к приватным атрибутам класса sync из класса async
    Код
    class BaseApi:
    
        @property
        @abstractmethod
        def domain(self):
            return NotImplementedError()
    
        @abstractmethod
        def fetch(self):
            return NotImplementedError()
    
        @abstractmethod
        def fetch_with_offset(self):
            return NotImplementedError()
    
        @abstractmethod
        def fetch_with_paging(self):
            return NotImplementedError()
    
        @abstractmethod
        def fetch_keep_last(self):
            return NotImplementedError()
    
    
    class SyncApi(BaseApi):
    
        def __init__(
            self,
            domain: AnyStr = None,
            headers: Dict = None,
            method: str = None,
            endpoint: str = None,
            dataclass: Callable = None
        ) -> None:
            self.__domain: str = domain
            self.__headers: Dict = headers
            self.__method: str = method
            self.__endpoint: str = endpoint
            self.__dataclass: Callable = dataclass
            self._session: ClientSession|Session = None
            self.data: List[Dict] = []
    
        @property
        def domain(self) -> bytes:
            return b'This is domain sync api'
    
        def fetch(self) -> bytes:
            return b'This is fetch with sync api'
    
        def fetch_with_offset(self) -> bytes:
            return b'This is fetch_with_offset with sync api'
    
        def fetch_with_paging(self) -> bytes:
            return b'This is fetch_with_paging with sync api'
    
        def fetch_keep_last(self) -> bytes:
            return b'This is fetch_keep_last with sync api'
        
    
    class AsyncApi(SyncApi):
    
        async def fetch(self):
            return super().fetch()
        
        async def fetch_with_offset(self):
            return super().fetch_with_offset()
        
        async def fetch_with_paging(self):
            return super().fetch_with_paging()
        
        async def fetch_keep_last(self):
            return super().fetch_keep_last()
    Написано
  • Как передать собственный класс на метод в качестве параметра по умолчании?

    @Bright144 Автор вопроса
    shurshur, окажется это можно сделать не явным способом. val = d() явный способ, а val = self.__class__() не явный. Плюс не явного способа если по какой-то причине изменяешь имя класса программа не рухнется.
    Написано
  • Как передать собственный класс на метод в качестве параметра по умолчании?

    @Bright144 Автор вопроса
    Михаил Р., Спасибо за советы, я изучу эти библиотеки.
    Ваш подход с методом set имеет некоторые недостатки, например, неочевидное поведение при передаче None в качестве значения.

    Да метод set не может принимать False, None или пустой объект в качестве значении. Хотел сделать и get и set в одном методе но бросил эту затею. Сделал это с помощи дандер методами getitem и setitem плюс преобразование
    код

    import json
    
    class Lkdict(dict):
    
        def __init__(self, d = {}) -> None:
            for key,val in d.items():
                if isinstance(val, dict):
                    val = self.__dict_to_self(val)
                d[key] = val
            return super().__init__(d)
    
        def __dict_to_self(self, d: dict):
            new_d = self.__class__()
            for key,val in d.items():
                if isinstance(val, dict):
                    val = self.__dict_to_self(val)
                new_d[key] = val
            return new_d
    
        def __getitem__(self, keys):
            if isinstance(keys, list):
                d = self
                for index,key in enumerate(keys):
                    if not isinstance(d, self.__class__):
                        raise KeyError(f'Key in list[{index}] not created. Check value dict with key in list[{index-1}]')
                    key in d or d.update(self.__class__({key: self.__class__()}))
                    d = d[key]
                return d
            return super().__getitem__(keys)
        
        def __setitem__(self, keys, value) -> None:
            if isinstance(value, dict):
                value = self.__dict_to_self(value)
            if isinstance(keys, list):
                key = keys.pop()
                d = self[keys]
                if not isinstance(d, self.__class__):
                    raise KeyError(f'Key in list[{len(keys)}] not created. Check value dict with key in list[{len(keys)-1}]')
                d[key] = value
                return
            return super().__setitem__(keys, value)
        
    
    employe = Lkdict()
    employe[['Vasya', 'documents', 'passport', 'id_number']] = 12345
    employe[['Vasya', 'documents', 'ID_Card', 'id_number']] = 6789
    employe[['Vasya', 'documents', 'ID_Card', 'id_number']] = 6
    employe[['Vasya', 'documents', 'ID_Card', 'name']] = []
    employe[['Vasya', 'documents', 'ID_Card', 'name']] = None
    employe[['Andrey', 'skills']] = [1,2]
    employe[['Andrey', 'skills']].append(4)
    employe[['Vasya', 'documents', 'passport', 'id_number']]
    employe[['Vasya', 'documents', 'ID_Card', 'id_number']]
    employe[['Vasya', 'documents', 'ID_Card', 'id_number']]
    employe[['Vasya', 'documents', 'ID_Card', 'id_number']]
    employe[['Vasya', 'documents', 'ID_Card', 'name']]
    
    print(json.dumps(employe, indent=1))

    Написано
  • Как передать собственный класс на метод в качестве параметра по умолчании?

    @Bright144 Автор вопроса
    Everything_is_bad, я задал вопрос именно по этому причину коротко и ясно, и мне нужно было именно это. Зачем мне мутит голову людей с длинным кодом. Для меня дичь это когда люди вставляю длинные коды который надо изучит, и говорят:
    у меня код не работает, такое ошибка вылезает что сделать?

    а с print или try не хотят воспользоваться.
    Написано
  • Как передать собственный класс на метод в качестве параметра по умолчании?

    @Bright144 Автор вопроса
    странно, с self не работает. нужно именно класс. Окажется ест разница. В методе set
    val = d() должен быт, val = self не работает.
    Написано
  • Как передать собственный класс на метод в качестве параметра по умолчании?

    @Bright144 Автор вопроса
    Everything_is_bad, что тут угадывать? Вопрос был коротким и ясным. Зачем мне выложит код целиком когда проблему можно объяснит по короче.
    Написано
  • Как передать собственный класс на метод в качестве параметра по умолчании?

    @Bright144 Автор вопроса
    Everything_is_bad, Проблему уже решили. И причем быстро
    Написано
  • Как передать собственный класс на метод в качестве параметра по умолчании?

    @Bright144 Автор вопроса
    Написал такой код:
    spoiler

    class d(dict):
        def set(self, key, val=None):
            if isinstance(key, list):
                for i in key[:-1]:
                    self = self.set(i)
                self[key[-1]] = val or self[key[-1]]
                return self[key[-1]]
            if val is None or isinstance(val, dict):
                val = d()
            self.get(key) or self.update(d({key: val}))
            return self.get(key)
    
    employe = d({'Andrey':d({'age': 31,
                         'profession': '',
                         'skills': [],
                         'documents':{}}),
                         })
    
    #аналогично который сделал на верху
    employe.set(['Vasya', 'documents', 'passport', 'id_number'], 12345)
    #еше тесты
    employe.set(['Vasya', 'documents', 'ID_Card', 'id_number'], 6789)
    employe.set(['Vasya', 'documents', 'ID_Card', 'name'], 'Vasya')
    employe.set(['Andrey', 'skills'], [1,2]).append(3)
    employe.set(['Andrey', 'skills']).append(4)
    print(json.dumps(employe, indent=1))


    там в методе set придется преобразовать dict в d, по этому мне понадобилось это. Или есть более простой или разумный способ?
    #для чтение
    print(employe.set(['Vasya', 'documents', 'ID_Card', 'id_number']))
    Написано
  • Как передать собственный класс на метод в качестве параметра по умолчании?

    @Bright144 Автор вопроса
    или в питоне имеется такие модули? Чтобы работать с словарями было проще.
    Написано
  • Как передать собственный класс на метод в качестве параметра по умолчании?

    @Bright144 Автор вопроса
    Когда хочешь добавлять или читать что-то на вложенный словарь зная структуру приходится пройти кучу проверки.
    Например:

    employe = {'Andrey':{'age': 31,
                         'profession': '',
                         'skills': [],
                         'documents':{}},
                         }
    
    if employe.get('Vasya', {}).get('documents', {}).get('passport'):
        employe['Vasya']['documents']['passport']['id_number'] = 12345
    elif employe.get('Vasya', {}).get('documents'):
        employe['Vasya']['documents']['passport'] = {'id_number': 12345}
    elif employe.get('Vasya'):
        employe['Vasya']['documents'] = {'passport': {'id_number': 12345}}
    else:
        employe['Vasya'] = {'documents': {'passport': {'id_number': 12345}}}

    создал такой класс чтобы упростит задачу
    Код

    class d(dict):
        def set(self, key, val=None):
            if isinstance(key, list):
                for i in key[:-1]:
                    self = self.set(i)
                self[key[-1]] = val or self[key[-1]]
                return self[key[-1]]
            if val is None or isinstance(val, dict):
                val = d()
            self.get(key) or self.update(d({key: val}))
            return self.get(key)
    
    employe = d({'Andrey':d({'age': 31,
                         'profession': '',
                         'skills': [],
                         'documents':{}}),
                         })
    
    #аналогично который сделал на верху
    employe.set(['Vasya', 'documents', 'passport', 'id_number'], 12345)
    #еше тесты
    employe.set(['Vasya', 'documents', 'ID_Card', 'id_number'], 6789)
    employe.set(['Vasya', 'documents', 'ID_Card', 'name'], 'Vasya')
    employe.set(['Andrey', 'skills'], [1,2]).append(3)
    employe.set(['Andrey', 'skills']).append(4)
    print(json.dumps(employe, indent=1))
    #для чтение
    print(employe.set(['Vasya', 'documents', 'ID_Card', 'id_number']))

    Написано
  • Как перевести строку в стандартный формат на python?

    @Bright144
    Mysql тут не причем, надо использовать json.loads
    import json
    
    text = 'Выбери'
    dump = json.dumps(text)
    print(dump)
    print(json.loads(dump))
    Написано
  • Направление шагового двигателя Arduino?

    @Bright144
    Chaynik_v_code, получается у тебя объект stepper внутри само контролирует весь этот процесс. А условия if else для визуализации. Я правильно понял?
    Написано
  • Направление шагового двигателя Arduino?

    @Bright144
    Chaynik_v_code, if (stepper.currentPosition() < targetPosition1)
    Это условия выполнение блок кода. Я имею в виду у тебя и в блоке if и в блоке else выполняется одно и тоже.
    Написано
  • Может ли работать IP камеры в кольцевой оптоволоконной сети?

    @Bright144 Автор вопроса
    Valentin Barbolin,
    Тут небольшая тонкость в терминологии, оптика была затянута как один кабель, но в данный момент это не кольцо, а отдельные аплинки между зданиями которые можно объединить в кольцо.
    да именно так.
  • Может ли работать IP камеры в кольцевой оптоволоконной сети?

    @Bright144 Автор вопроса
    Valentin Barbolin, Akina, оптоволоконный кабеля с ребятами сами затянули, это закольцованный оптоволокно с шести жилами, длина кольцо получилось 4км. После прокладки оптоволокно вызвали сварщика, и он поставил 1 ODF для каждого здании, в каждом ODF торчит 12портов для пачкорда. Порты 1-6 для входного кабеля, а порты 7-12 для выходного кабеля в каждом здании. Для АСУ используется только 2 жилы(4 порта ODF) оптоволокна, остальные 4 жилы(8 порта ODF) свободно. Я хочу использовать эти свободные линии оптики для камеры, не буду трогать сеть АСУ. Но они настаивают чтобы мы тянули новые линии оптики в топологии звезды, причину не объясняют.
  • Может ли работать IP камеры в кольцевой оптоволоконной сети?

    @Bright144 Автор вопроса
    Нужны не медиаконверторы, а L2 коммутаторы с минимум двумя SFP или SFP+ разъемами трансиверы под соответствуюшее волокно. И все в кольцо прекрастно собирается.

    значить мне нужно приобрести L2 коммутаторы с двумя SFP или SFP+ разъемами и трансиверы для single mode кабеля? Тут у нас все готово, все что нужно подключит свитч на ODF оптики с помощи SM patchcord.
  • Может ли работать IP камеры в кольцевой оптоволоконной сети?

    @Bright144 Автор вопроса
    сейчас у нас имеется свободные 4 линии оптики, но прокладка кабеля выполнен кольцевой.
  • Может ли работать IP камеры в кольцевой оптоволоконной сети?

    @Bright144 Автор вопроса
    я не хочу трогать сеть АСУ. Я хочу использовать свободные(не используемые 4линии) линии оптики для IP камеры, поставив новые mediconverter. Но айтишники настаивают прокладывать новую кабель оптики в топологии звезды, причину не объясняют.
  • Может ли работать IP камеры в кольцевой оптоволоконной сети?

    @Bright144 Автор вопроса
    я не хочу трогать сеть АСУ. Я хочу использовать свободные(не используемые 4линии) линии оптики для IP камеры, поставив новые mediconverter. Но айтишники настаивают прокладывать новую кабель оптики в топологии звезды, причину не объясняют.
  • Может ли работать IP камеры в кольцевой оптоволоконной сети?

    @Bright144 Автор вопроса
    Valentin Barbolin, тут есть свободный 4 оптоволоконный линия, но прокладка кабеля сделан в кольцевом топологии.