Обеспечение проверки типов в функциях Python - PullRequest
0 голосов
/ 30 августа 2018

Я пытаюсь написать функции Python, которые обеспечивают проверку типов. Я бы попытался сделать это, используя assert и isinstance() в первой строке функции следующим образом:

import numpy as np
import pandas as pd 

array_like = Union[pd.core.series.Series, np.ndarray]
LOG_TRANSFORM_CONST = 1.01


def log_transform(feature: array_like) -> array_like:
    assert isinstance(feature, array_like)

    # First remove negative entries
    feature[feature < 0.0] = 0.0

    # Add a small constant to avoid NANs while applying logs
    feature = feature + LOG_TRANSFORM_CONST

    return np.log(feature)

Этот код не работает, так как вы не можете использовать Union вместе с isinstance(). Тем не менее, следующий фрагмент кода работает:

def log_transform(feature: array_like) -> array_like:
    assert type(feature) in [pd.core.series.Series, np.ndarray]

    # First remove negative entries
    feature[feature < 0.0] = 0.0

    # Add a small constant to avoid NANs while applying logs
    feature = feature + LOG_TRANSFORM_CONST

    return np.log(feature)

if __name__ == '__main__':
    df = pd.DataFrame(columns=['A', 'B'])
    df['A'] = [1, 2, 3, 4]
    df['B'] = [10, 20, 30, 40]
    tr_arr = log_transform(df.A)
    print(tr_arr)
    y = log_transform(np.array([2, 4, 6, 8, 10]))
    print(y)

Мой вопрос: целесообразна ли эта практика? Каковы лучшие практики относительно проверки типов в Python? Я знаю, что можно устанавливать сторонние библиотеки специально для проверки типов, но я стараюсь этого избегать.

1 Ответ

0 голосов
/ 26 сентября 2018

Попытка проверить типы с помощью утверждений имеет ограничения. Во-первых, типы проверяются во время выполнения, поэтому вы не можете быстро отловить ошибки, или даже вообще, если часть кода с утверждением не выполняется. Во-вторых, некоторые типы нельзя проверить с помощью утверждений; например, вы не можете утверждать, что переменная имеет тип «функция от числа к числу».

Использование инструмента проверки типов - лучший вариант. Вы можете попробовать mypy ; один из его основных авторов - Гвидо ван Россум, так что это законно: D

...