Ответы пользователя по тегу Python
  • Как найти в каком диапазоне находится число?

    @Sir_MaNiAl
    Для коротких списков вполне можно просто обойти все элементы.

    def get_group(value, sorted_list):
        for i, breakpoint in enumerate(sorted_list):
            if value < breakpoint:
                return i
        # значение больше последнего в списке
        return len(sorted_list)
    
    
    l = [100, 200, 300, 400, 500]
    print(get_group(215, l))


    Для очень длинного списка стоит предварительно построить по списку бинарное дерево чтобы уменьшить количество проверок.
    Ответ написан
    Комментировать
  • Как получить название объекта дескриптора и класса в котором дескриптор инициализируется python?

    @Sir_MaNiAl
    Дескриптор сначала инстанцируется и инициализируется, и только потом ему присваевается имя A.b. Так что если имя класса и дескриптора не передать явно - никак.
    Если уж это так принципиально, можно передать эти значения неявно, например, с помощью метакласса. Но это значительно усложнит восприятие кода, сто раз спросите себя нужно ли это вам.
    Пример реализации через метакласс:
    #Псевдо-дескриптор сохранит все переданные аргументы и
    #...передаст их метаклассу для инициализации дескриптора
    class PseudoDescriptor:
        __slots__ = ('args', 'kwargs')
    
        def __init__(self, *args, **kwargs):
            self.args = args
            self.kwargs = kwargs
    
    
    class MyMeta(type):
        def __init__(cls, class_name, bases, attrs):
            for key, value in attrs.items():
                #Ищем псевдо-дескрипторы
                if isinstance(value, PseudoDescriptor):
                    # Заменяем на дескрипторы
                    # Инициализируем дескрипторы с известными именами
                    descriptor = Descriptor(parent_class_name=class_name,
                                            instance_name=key,
                                            *value.args,
                                            **value.kwargs)
                    setattr(cls, key, descriptor)
    ###
    ###
    
    
    class Descriptor:
        def __init__(self, parent_class_name, instance_name, foo, bar=None):
            #Название объекта лежит в instance_name
            #Название класса лежит в parent_class_name
            #foo и bar - какие-то аргументы, передающиеся явно при объявлении класса
            print('Имя класса:', parent_class_name, '\nИмя аттрибута:', instance_name)
    
    
    class TestClass(metaclass=MyMeta):
        #Вместо Descriptor используем PseudoDescriptor
        #Метакласс MyMeta извлечет из него переданные данные
        #... и создаст вместо этого объект класса Descriptor
        test_attribute = PseudoDescriptor(foo=1)
    Ответ написан
    Комментировать
  • Были приведен пример в Python 3.7. Список не открывается в программе, почему?

    @Sir_MaNiAl
    Материал рассчитан на постепенный ввод в консоли Python команда-за-командой: то что отмечено как <class 'int'> - это то, что вы увидите в ответ на введенную команду type(a).
    Эта строка не является допустимой коммандой языка Python и не должна присутствовать в исходном коде. Удалите её и ей подобные из файла test.py.
    Скорректируйте содержимое файла:
    a = 10
    b = "hello"
    c = (1, 2)
    #При запуске кода из файла видно только то, что выводится командой "print()"
    print(type(a))
    print(type(b))
    print(type(c))

    Вывод в консоль:
    <class 'int'>
    <class 'str'>
    <class 'tuple'>
    Ответ написан
    Комментировать
  • Python, Flask ошибка?

    @Sir_MaNiAl
    Как верно подметил Роман - "если ничего не менял". Убедись что в каталоге проекта нет модуля json. (файл json.py или каталог json с файлом __init__.py). Как только найдешь - переименуй и больше не используй имена совпадающие с именами сторонних модулей или из стандартной библиотеки. Успехов!
    Ответ написан
    Комментировать