Перейти к содержимому

Как вынести функции в отдельный файл python

  • автор:

Вызов функции из другого файла в Python

Set_up: У меня есть файл .py для каждой функции, которую мне нужно использовать в программе.

В этой программе мне нужно вызвать функцию из внешних файлов.

Но я получаю ошибку:

ImportError: нет модуля с именем ‘file.py’; файл не является пакетом

Как исправить эту проблему?

13 ответов

При импорте не нужно добавлять file.py . Просто напишите from file import function , а затем вызовите функцию с помощью function(a, b) . Причина, по которой это может не работать, заключается в том, что file является одним из основных модулей Python, поэтому я предлагаю вам изменить имя вашего файла.

Обратите внимание, что если вы пытаетесь импортировать функции из a.py в файл с именем b.py , вам нужно убедиться, что a.py и b.py находятся в одном каталоге.

Прежде всего вам не нужен .py .

Если у вас есть файл a.py и внутри вас есть некоторые функции:

И вы хотите импортировать их в z.py , вам нужно написать

Вы можете сделать это двумя способами. Сначала нужно просто импортировать определенную функцию из файла .py. Для этого используйте

Другой способ — импортировать весь файл

Затем вы можете вызвать любую функцию внутри файла file.py, используя

Сначала сохраните файл в формате .py(например, my_example.py ). И если этот файл имеет функции,

В вызывающей функции вам просто нужно ввести следующие строки.

Наткнулся на ту же функцию, но мне пришлось сделать ниже, чтобы она заработала.

Если вы видите «ModuleNotFoundError: модуль не назван», вам, вероятно, нужна точка (.) Перед именем файла, как показано ниже;

из функции импорта .file

Вы также можете вызвать функцию из другого каталога, если вы не можете или не хотите, чтобы функция находилась в том же каталоге, где вы работаете. Вы можете сделать это двумя способами (возможно, есть больше альтернатив, но это те, которые помогли мне).

Альтернатива 1 Временно измените ваш рабочий каталог

Альтернатива 2 Добавьте каталог, в котором у вас есть функция, в sys.path.

Вам не нужно добавлять file.py .

Просто сохраните файл в том же месте с файлом, из которого вы хотите его импортировать. Затем просто импортируйте свои функции:

Переименуйте модуль в нечто иное, чем «файл».

Также убедитесь, что при вызове функции:

1) если вы импортируете весь модуль, вы повторяете имя модуля при его вызове:

2) или если вы импортируете определенные функции, функции с псевдонимом или все функции, использующие *, вы не повторяете имя модуля:

У вас должен быть файл в том же месте, что и файлы Python, которые вы пытаетесь импортировать. Также достаточно «из функции импорта файлов».

в моем случае я назвал свой файл helper.scrap.py и не смог заставить его работать, пока я не изменил на helper.py

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

Допустим, у вас есть следующая структура пакета в вашем проекте Python:

Изображение 109046

in — com.my.func.DifferentFunction Python файл, у вас есть какая-то функция, например:

И вы хотите вызывать различные функции из Example3.py , а затем сделать это следующим образом:

Определить оператор импорта в Example3.py — файле для импорта всех функций

How can I separate the functions of a class into multiple files?

I have a main class that has a ton of different functions in it. It’s getting hard to manage. I’d like to be able to separate those functions into a separate file, but I’m finding it hard to come up with a good way to do so.

Here’s what I’ve done so far:

File main.py

File separate.py

I do this because if I do:

I want to be able to do:

separate.long_func_1(obj_1, a, b)

I know this seems kind of nit-picky, but I want just about all of the code to start with obj_1. , so there isn’t confusion.

Is there a better solution that what I’m currently doing? The only issues that I have with my current setup are:

  1. I have to change arguments for both instances of the function
  2. It seems needlessly repetitive

I know this has been asked a couple of times, but I couldn’t quite understand the previous answers and/or I don’t think the solution quite represents what I’m shooting for. I’m still pretty new to Python, so I’m having a tough time figuring this out.

Peter Mortensen's user avatar

3 Answers 3

Here is how I do it:

Class (or group of) is actually a full module. You don’t have to do it this way, but if you’re splitting a class on multiple files I think this is ‘cleanest’ (opinion).

The definition is in __init__.py , methods are split into files by a meaningful grouping.

A method file is just a regular Python file with functions, except you can’t forget ‘self’ as a first argument. You can have auxiliary methods here, both taking self and not.

Methods are imported directly into the class definition.

Suppose my class is some fitting GUI (this is actually what I did this for first time). So my file hierarchy may look something like

So plot stuff will have plotting methods, fit stuff contains fitting methods, and data stuff contains methods for loading and handling of data — you get the point. By convention I mark the files with a _ to indicate these really aren’t meant to be imported directly anywhere outside the module. So _plotsuff.py for example may look like:

etc. Now the important thing is file __init__.py :

Tom Sawyer mentions PEP-8 recommends putting all imports at the top, so you may wish to put them before __init__ , but I prefer it this way. I have to say, my Flake8 checker does not complain, so likely this is PEP-8 compliant.

Note the from . import . is particularly useful to hide some ‘helper’ functions to your methods you don’t want accessible through objects of the class. I usually also place the custom exceptions for the class in the different files, but import them directly so they can be accessed as Fitter.myexception .

If this module is in your path then you can access your class with

It is not completely intuitive, but not too difficult either. The short version for your specific problem was you were close — just move the import into the class, and use

and don’t forget your self !

How to use super addendum

super() is a useful nifty function allowing parent method access in a simple and readable manner from the child object. These kind of classes are big to begin with, so inheritance not always make sense, but if it does come up:

For methods defined in the class itself, within __init__.py , you can use super() normally, as is.

If you define you method in another module (which is kind of the point here), you can’t use super as is since the function is not defined in the context of your cell, and will fail. The way to handle this is to use the self argument, and add the context yourself:

Note you cannot omit the second argument, since out of context super does not bind the object method (which you usually want for calls like super(. ).__init__() ).

If this is something you want to do in many methods in different modules, you may want to provide a super method in the __init__.py file for use:

Импорт и создание модулей

Питон включает в себя обширную библиотеку модулей, в которых реализовано множество полезных функций. Далее в этом курсе мы будем применять и другие полезные модули: re для регулярных выражений, collections , содержащий множество удобных структур данных, os и shutil для управления файлами и папками.

Для использования модуля его нужно импортировать — попросить питон загрузить его и сделать его функции доступными для использования. Импорт осуществляется с помощью оператора import . Например, модуль random используется для генерации “случайных” чисел.

Ещё один пример: модуль math , содержащий различные математические функции и константы

Использование псевдонимов

Если название модуля слишком длинное и вы не хотите его писать каждый раз, когда используете какую-то функцию, вы можете импортировать этот модуль под псевдонимом с помощью as:

Импорт нескольких модулей

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

Инструкция from

Иногда в модуле бывает много разных функций, а вам нужно использовать только что-то одно (и, например, использовать много раз), тогда проще импортировать какую-то определенную функцию из этого модуля и (1) чуть-чуть сэкономить память, (2) короче синтаксис. Тогда синтаксис импорта будет следующий:

Также можно импортировать из модуля всё. То есть все функции, переменные и классы. Тогда нам не нужно каждый раз писать название модуля.

Правило хорошего тона — импортировать модули вначале вашей программы, до любого другого кода и функций.

Создание своего модуля питон

Любой файл с исходным кодом на Python — модуль! Это значит, что любая программа может выступать в роли модуля для другой и импортироваться.

Давайте напишем скрипт с парой функций и импортируем эти функции в другую программу.

Создадим программу mymodule.py:

В ней мы прописали две математические функции: среднее и факториал. Предположим теперь мы хотим воспользоваться ими в какой-нибудь другой программе myscript.py. Тогда мы положим эти два файла в одну директорию, чтобы импорт работал. И в результате мы сможем ипмортировать эти функции в новую программу.

Файл myscript.py:

Кстати, найдите баг в этом коде:

Задача: составление анаграмм

В качестве примера использования функций и модуля стандартной библиотеки random рассмотрим задачу составления анаграмм. В качестве входного файла будем использовать любой текст, из которого мы выберем слова. Пусть текст находится в файле text.txt и имеет следующее содержание (из Яндекс.Рефератов):

Задача состоит в том, что необходимо составить файл формата TSV, состоящий из 4 колонок: слово из файла и три его случайных анаграммы. Для простоты анаграммы могут совпадать с самим словом или друг с другом. В итоге требуется получить файл table.tsv , который будет начинаться следующим образом:

Полный код для решения этой задачи может выглядеть следующим образом:

Домашнее задание

Пусть какая-то функция получает на вход список из 30 случайных целых чисел от 0 до 100, сгенерированных с помощью модуля random. В вариантах описана функция.

+1 балл для всех: ответьте коротко на вопрос “Почему модуль random на самом деле НЕ генерирует случайные числа?”

Функция берёт два случайных числа из этого списка (с помощью модуля random) и считает по ним количество всевозможных сочетаний этих чисел с точки зрения теории вероятности, С из n по k (использовать функцию из модуля math – factorial). Количество сочетаний (в формате float) печатается. k должно быть меньше n

Функция возвращает произведение значений списка. Нужно пользоваться модулем math. Руководствоваться надо тем, что exp(log(a) + log(b)) = a * b

Функция возвращает строку из 30 букв. Список, полученный на вход, задает порядок букв в строке по номеру буквы в алфавите.

Функция берёт из списка 4 случайных числа, условно принимает их за две точки в двумерном пространстве и возвращает евклидово расстояние между этими точками. Использовать модули random и math.

Функция перемешивает список с помощью random.shuffle(), сравнивает его с исходным списком и возвращает количество индексов, значение элемента по которым поменялось. Запустите функцию в цикле 100 раз и напечатайте в скольки процентов случаев меняются все элементы списка.

Функция возвращает среднее геометрическое списка. Вомпользуйтесь модулем math. Отдельно вне функции покажите, что ее результат лежит между минимальным и максимальным значениями списка для 20 случаев. (Для это нужно на каждой итерации генерировать подаваемый на вход список заново)

Функция возвращает среднее арифметическое элементов списка, округлённое вверх. Используйте модуль math.

Python-сообщество

Она тоже работает хорошо, но каждый из методов я не смогу описать в отдельных файлах. Если это сделать получится класс shape импортирует метод makeRec, которому нужен класс Rectangle, в котором импортируется метод show, в котором СНОВА нужен класс shape. Запутанно конечно.. Короче так:

Работать не будет из-за циклического импортирования

В общем цель описать КАЖДУЮ сущность (класс, метод) в отдельном файле. Как это сделать в такой ситуации?

#2 Фев. 25, 2011 16:55:21

Как описать метод класса отдельным файлом?

Кажется, вам нужно что-то совсем другое, отличное от разнесения кода по отдельным классам.

Расскажите, что?
Пример на простой предметной области, изложенный обыкновенным русским языком — сильно помогает пониманию.

#3 Фев. 25, 2011 17:13:55

Как описать метод класса отдельным файлом?

можно разорвать цикл., а связи построить при запуске программы.
например для класса Rectangle наследование прикрутить при запуске программы или в метод makeRec вызов rectangle() при запуске засунуть.

но это извращение.

#4 Фев. 25, 2011 18:40:25

Как описать метод класса отдельным файлом?

Андрей Светлов, Мне нужно описать с помощью ООП геометрические фигуры. Второй пример кода, с моей точки зрения очень хорош.

В компилируемых языках есть понятие “единица компиляции”, по суть это один файл исходного кода. Если методы очень большие их лучше описывать в отдельных файлах. Это удобно по множеству причин. Подобный код в с++ я без проблем могу разнести в разные файлы, использую файлы заголовков.
В python’е не получается. Может я не правильно проектирую методы?

Как можно разнести по отдельным файлам сущности такого кода? (in — функция ввода out — функция вывода)

# -*- coding: utf-8 -*-
#from shape_in import In
from shape_out import Out

from circle_in import In as InC
from circle_out import Out as OutC

from rectangle_in import In as InR
from rectangle_out import Out as OutR

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *