Динамический тип класса намеки на Python? - PullRequest
0 голосов
/ 29 октября 2019

Я пытаюсь предоставить подсказку типа в PyCharm динамически для определенного класса, что означает, что одному из его атрибутов присвоено значение во время __init__, который, в свою очередь, является объектом.

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

class Dynamic:
    def __init__(self):
        self.field1 = "field1"
        self.field2 = "field2"


class Reusable:
    def __init__(self, dynamics=None):
        if dynamics:
            self.values = dynamics
        else:
            self.values = "nothing"


dynamic_test = Dynamic()
test = Reusable(dynamics=dynamic_test)
print(test.values.)  # this is the place where auto-complete should take place

Очевидно, что автозаполнение не происходит. Я пробовал что-то похожее на

class Reusable:
    value_type = str  # type to-be-modified later
    values: value_type

    def __init__(self, dynamics=None):
        if dynamics:
            self.values = dynamics
        else:
            self.values = "nothing"
        Reusable.value_type = type(self.values)  # doesn't actually modify that so I won't have auto-complete based on type

Я знаю, что есть некоторые возможности, связанные с обработкой встроенной функции __dir__, однако мне тоже не повезло с этим (не уверен, зависит ли от автозаполнения PyCharmалгоритм или нет), и никакие плагины не были разработаны в этом направлении.

Есть ли способ, которым я могу обойти это и иметь эту функцию автозаполнения в этом случае?

1 Ответ

0 голосов
/ 30 октября 2019

Рассмотрите возможность использования подсказок типа:

from typing import Generic, TypeVar, Union

T = TypeVar("T")


class Reusable(Generic[T]):
    values: Union[str, T]

    def __init__(self, dynamics: T = None):
        if dynamics:
            self.values = dynamics
        else:
            self.values = "nothing"

Здесь мы отметили Reusable как класс, который можно параметризировать с помощью T.

Путем пометки dynamics как Tнам указано, где получить точное значение T.

Union[str, T] означает, что values является либо str, либо T.

См. PEP-484 для более подробной информации.

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