Python: Как выполнить приведение на основе типа без необходимости импорта объектов, которые нам нужны для проверки типа

#python

#python

Вопрос:

Рассмотрим в качестве примера следующую функцию:

 import numpy as np

# module.py
def func(x):
    if isinstance(x, np.ndarray):
        x = x.tolist()
    assert isinstance(x[0], int)
    # do more stuff...
    return x
  
 >>> x = np.array([1,2,3], np.int16)
>>> func(x)
[1, 2, 3]
  

Как можно реализовать условное приведение без необходимости импортировать numpy?

Одним из способов сделать это было бы сделать:

 if str(type(x)) == "<class 'numpy.ndarray'>"):
    x = x.tolist()
...
  

но это решение кажется хрупким (зависит от стабильности __str__ метода).

Есть менее хрупкие способы сделать это?

Приложение для отклонения вероятных (но бесполезных) ответов: я знаю, как печатать на duck, hasattr , и не хочу вдаваться в подробности о том, почему я хочу избежать импорта в первую очередь.

Комментарии:

1. Безоговорочно делать x = x.tolist() внутри try блока, который игнорирует AttributeErrors? Если какой-либо другой класс, чем numpy.ndarray имеет такой метод, кажется вероятным, что вам действительно нужно будет вызвать его, чтобы ваш код заработал.

2. @jasonharper, это утиный ввод. Если предложений if много, это становится уродливым (и неэффективным) и зависит от предположения, что tolist означает то, что мы хотим, чтобы это означало, если оно существует.