Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 4, 2018 12:39:55

Sterh
Зарегистрирован: 2018-06-18
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Функция не видит библиотеку.

Прошу прощения за нубский вопрос, но чет я даже не понимаю, в какую сторону гуглить…
Ситуация:
Есть обычный импорт модулей в начале файла:

 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”

Собственно вопрос: Как заставить вызываемую из файла функцию видеть объявленную библиотеку?

Офлайн

#2 Сен. 4, 2018 13:16:24

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Функция не видит библиотеку.

вы не правильно понимаете как работает импорт модулей в питоне. Здесь не как в C, здесь код одного модуля не вставляется в место вызова. Вам надо почитать в книге про питон главу “Области видимости”.
А прямой ответ на ваш вопрос неоднозначен несколько. Я бы предложил что бы ваша функция принимала первым аргументом объект с которым работает.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Сен. 4, 2018 16:10:10

Sterh
Зарегистрирован: 2018-06-18
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Функция не видит библиотеку.

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

Вопрос: Как сделать так, что бы второй вариант работал?

Офлайн

#4 Сен. 4, 2018 16:21:20

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Функция не видит библиотеку.

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

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



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Сен. 4, 2018 16:22:54)

Офлайн

#5 Сен. 4, 2018 16:36:18

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Функция не видит библиотеку.

 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, 'произвольная фраза')



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#6 Сен. 4, 2018 17:22:04

Sterh
Зарегистрирован: 2018-06-18
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Функция не видит библиотеку.

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) смотрю результат, и если он не устраивает, то вызываю другие функции

Собственно на данный момент, приходится просто копипастить код функции вместо вызова функции из файла (Это не сложно, но очень неудобно таскать портянки кода туда-сюда).

Офлайн

#7 Сен. 4, 2018 17:48:21

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Функция не видит библиотеку.

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



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Сен. 4, 2018 17:48:32)

Офлайн

#8 Сен. 4, 2018 18:00:40

Sterh
Зарегистрирован: 2018-06-18
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Функция не видит библиотеку.

PEHDOM
Какие религиозные причины мешают вам провети импорт всех нужных модулей непосредственно в “файле с функциями”?

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

Да.. а импортировать прямо в функциях - так тоже делал. Но получалось, что импорт одной и той же библиотеки по пять раз получался… На мое нубское имхо, это как-то неправильно… )

Отредактировано Sterh (Сен. 4, 2018 18:03:11)

Офлайн

#9 Сен. 4, 2018 18:17:45

Sterh
Зарегистрирован: 2018-06-18
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Функция не видит библиотеку.

Опять не работает ((
В “файле с функциями” прописал импорт библиотек:

 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

пойду застрелюсь ….

Офлайн

#10 Сен. 4, 2018 18:55:06

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Функция не видит библиотеку.

не надо стреляться. Лучше перестаньте быдлокодить и почитайте учебную литературу.
Я как то не очень отношусь к движухе по занижению порога входа в Питон…вот такое имеем в итоге.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version