Найти - Пользователи
Полная версия: Функция не видит библиотеку.
Начало » Python для новичков » Функция не видит библиотеку.
1 2
Sterh
Прошу прощения за нубский вопрос, но чет я даже не понимаю, в какую сторону гуглить…
Ситуация:
Есть обычный импорт модулей в начале файла:
 import re
import pandas as pd
import statistics
import matplotlib.pyplot as plt
import numpy as np
from pymystem3 import Mystem
m = Mystem()
import fun_raschet

В нем же импорт файла с моими функциями (fun_raschet). Мои функции используют библиотеки импортированные выше:
 def key_vvod(key_phrase):
    key_phrase = m.lemmatize(key_phrase) #Библиотека Mystem
    key_list = []
    for word in key_phrase:
        word = word.lower()
        word = re.sub('[^\w\d\s]+', ' ', word) #Библиотека re
....
и т.д.

Далее по файлу вызываю свою функцию:
 key_list = fun_raschet.key_vvod('некий набор слов')
key_list

И мне выдает ошибку “name ‘m’ is not defined”

Собственно вопрос: Как заставить вызываемую из файла функцию видеть объявленную библиотеку?
JOHN_16
вы не правильно понимаете как работает импорт модулей в питоне. Здесь не как в C, здесь код одного модуля не вставляется в место вызова. Вам надо почитать в книге про питон главу “Области видимости”.
А прямой ответ на ваш вопрос неоднозначен несколько. Я бы предложил что бы ваша функция принимала первым аргументом объект с которым работает.
Sterh
JOHN_16, спасибо за ответ, только я все равно не понимаю (я в целом в программировании нуб, в С вообще ничего не знаю). Пытаюсь гуглить по “области видимости”, но ответа не нахожу. Попробую переформулировать вопрос:

Делаю так (первый вариант):
 from pymystem3 import Mystem
m = Mystem()
def lemm(som_text):
    text = m.lemmatize(som_text)
    return text
text = lemm('произвольная фраза')
text
Все прекрасно работает. Далее, функцию lemm выношу в отдельный файл f_lemm.py

Делаю так (второй вариант):
 from pymystem3 import Mystem
m = Mystem()
import f_lemm
text = f_lemm.lemm('произвольная фраза')
text

И получаю ошибку:
 ---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-4-96c5fc3e6cc1> in <module>()
      2 m = Mystem()
      3 import f_lemm
----> 4 text = f_lemm.lemm('произвольная фраза')
      5 text
~\AnacondaProjects\gotovie_moduli\f_lemm.py in lemm(som_text)
      6 
      7 def lemm(som_text):
----> 8     text = m.lemmatize(som_text)
      9     return text
     10 
NameError: name 'm' is not defined

Вопрос: Как сделать так, что бы второй вариант работал?
PEHDOM
Sterh
Как сделать так, что бы второй вариант работал?
а зачем вы m = Mystem() выносите из функции? в этом есть какой глубокий известный только особопосвященным смысл? почему нельзя сделать так в f_lemm?

 from pymystem3 import Mystem
def lemm(som_text):
    m = Mystem()
    text = m.lemmatize(som_text)
    return text
JOHN_16
 def lemm(m, som_text):
    text = m.lemmatize(som_text)
    return text

 from pymystem3 import Mystem
m = Mystem()
import f_lemm
text = f_lemm.lemm(m, 'произвольная фраза')
Sterh
JOHN_16, спасибо! Тоже думал о таком способе. Но если внутри функции используются несколько библиотек (Mystem, re, pandas as pd, и т.д.), то их так и перечислять по порядку?

  def lemm(m, re, pd,  som_text):
    text = m.lemmatize(som_text)
    return tex

  from pymystem3 import Mystem
m = Mystem()
import f_lemm
text = f_lemm.lemm(m, re, pd, 'произвольная фраза')
—-
Если нет, то возможно я ошибаюсь на более глобальном уровне, и сам код нужно организовывать по другому… Собственно более глобальная цель выглядит так:
Есть пара десятков функций, выполняющие различные расчеты и обработки. Далее действия представлялись так:
1) импортирую библиотеки, которые используются в этих функциях
2) импортирую файл с функциями
3) вызываю две, три нужных на данный момент функции
4) смотрю результат, и если он не устраивает, то вызываю другие функции

Собственно на данный момент, приходится просто копипастить код функции вместо вызова функции из файла (Это не сложно, но очень неудобно таскать портянки кода туда-сюда).
PEHDOM
Sterh
Собственно более глобальная цель выглядит так:
Какие религиозные причины мешают вам провети импорт всех нужных модулей непосредственно в “файле с функциями”? вплоть до того(если вы боитесь что у вас слишком много импортируеться ненужного) чтобы импотрировать библиотеки прямо в функциях?
Sterh
PEHDOM
Какие религиозные причины мешают вам провети импорт всех нужных модулей непосредственно в “файле с функциями”?

Будете смеяться, но я пробовал - не работало… Сейчас заработало О_о… Спасибо! Видимо Ваше религиозное благословление помогло

Да.. а импортировать прямо в функциях - так тоже делал. Но получалось, что импорт одной и той же библиотеки по пять раз получался… На мое нубское имхо, это как-то неправильно… )
Sterh
Опять не работает ((
В “файле с функциями” прописал импорт библиотек:
 import json
import re
import pandas as pd
import statistics
import matplotlib.pyplot as plt
import numpy as np
from pymystem3 import Mystem
m = Mystem()

Далее файл с кодом (до вызова функций еще не добрался):
 with open(f_shina, 'r') as f:
    shina = json.loads(f.read())
    f.close

Выдает ошибку:
 NameError                                 Traceback (most recent call last)
<ipython-input-4-639634771e93> in <module>()
      1 #Загружаем шину и индексные файлы
      2 with open(f_shina, 'r') as f:
----> 3     shina = json.loads(f.read())
      4     f.close
      5 with open(f_direct, 'r') as f:
NameError: name 'json' is not defined

пойду застрелюсь ….
JOHN_16
не надо стреляться. Лучше перестаньте быдлокодить и почитайте учебную литературу.
Я как то не очень отношусь к движухе по занижению порога входа в Питон…вот такое имеем в итоге.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB