#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. Отличное объяснение! Спасибо.