#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
означает то, что мы хотим, чтобы это означало, если оно существует.