Python: Как я могу убедиться, что псевдонимы модулей, используемые в функциях, верны?

#python #pandas #function #numpy #alias

#python #pandas #функция #numpy #псевдоним

Вопрос:

Я пытаюсь сделать функцию foo доступной для любого пользователя. Как я могу гарантировать, что они импортируют модули с определенными псевдонимами?

 def foo(object):
    objdtypes = (list, tuple, np.ndarray, pd.core.series.Series)
    if isinstance(object,objdtypes): 
        print("It's there")
  

Прямо сейчас я делаю что-то подобное, что не кажется устойчивым, если они должны использовать разные псевдонимы для numpy и pandas.

 def checkAlias():
    while True:
        try:
            np.BUFSIZE
            pd.BooleanDtype.name
            return True
        except NameError:
            print("n"  
                  "Please add the following commands to your script and try again:n"  
                  "import numpy as npn" 
                  "import pandas as pd")
            return
  

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

1. Когда вы говорите «сделать функцию foo доступной для любого пользователя», вы ожидаете, что они скопируют вашу функцию в свои файлы? Такого рода вещи являются проблемой только для людей, копирующих вашу функцию — если вы распространяете модуль, не имеет значения, какие псевдонимы пользователи вашего модуля используют или не используют. В вашем коде будет импорт, необходимый вашему коду.

Ответ №1:

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

 def foo(obj):
    import pandas as pd
    import numpy as np

    objdtypes = (list, tuple, np.ndarray, pd.core.series.Series)
    if isinstance(obj, objdtypes): 
        print("It's there")
  

Также не используйте object в качестве имени переменной, потому что это затенит встроенный object .

Ответ №2:

Когда кто-то импортирует вашу функцию, все необходимые модули будут импортированы с тем псевдонимом, который вы использовали. Например, вы можете создать файл с именем, скажем, mymodule.py , содержащий:

 import numpy as np

def myfunc(arg):
    return np.sin(arg)
  

Если вы затем откроете сеанс терминала Python и используете:

 from mymodule import myfunc

print(myfunc(2))
0.9092974268256817
  

это будет работать отлично. Это будет работать, даже если вы импортируете numpy с другим псевдонимом в сеансе терминала, например,

 import numpy as blah
from mymodule import myfunc

print(myfunc(2))
0.9092974268256817
  

После импорта myfunc , если вы посмотрите на:

 myfunc.__globals__
{'__builtins__': {'ArithmeticError': ArithmeticError,
...
'__file__': 'module.pyc',
 '__name__': 'module',
 '__package__': None,
 'myfunc': <function module.myfunc>,
 'np': <module 'numpy' from '/usr/local/lib/python2.7/dist-packages/numpy/__init__.pyc'>}
  

вы видите, что он содержит ожидаемый псевдоним для numpy ( np ), и это то, что он будет использовать.

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

1. Отличное объяснение! Спасибо.