2017-01-18 3 views
0

Я занимаюсь разработкой модуля, чтобы помочь мне справиться с файлами, это структура:Правильный способ реализации одной функции каждого файла в Python

Archive/ 
| archive/ 
    - __init__.py 
    - move.py 
    - rename.py 
    - mime_type.py 
| setup.py 

Я проектирование один файл - одна функция. Для меня это лучше, я чувствую себя более комфортно с этим стилем, так как у меня есть фон Node.js и C/C++.

Итак, мои сомнения о том, как реализовать __init__.py, чтобы иметь возможность вызывать функции с помощью:

from archive import move 
from archive import rename 
from archive import mime_type 

Вместо:

from archive import move.move 
from archive import rename.rename 
from archive import mime_type.mime_type 

Я делаю так:

__init__.py 

from move import move 
from rename import rename 
from mime_type import mime_type 

Есть ли более простой способ автоматически добиться такого поведения? Без необходимости изменения __init__.py каждый раз, когда я создаю файл.

Спасибо.

+1

Я думаю, что вы застряли в этом. Python обычно не следует за одним файлом для однокомпонентной структуры кода, поэтому, вероятно, нет «правильного» способа. Один файл должен быть * модулем *, набором функций. Вы делаете это более сложным для себя таким образом. –

+0

Модуль os может помочь. – user86895

+0

Не могу поверить в это утверждение @ juanpa.arrivillaga, я чувствую себя намного более комфортно, используя этот дизайн, и это все, что есть, дизайнерское решение. Мне кажется, гораздо легче найти функции, поддерживать, читать и расширять. Кроме того, если у меня есть одна функция для каждого файла, более ясно, какие зависимости должна выполнять функция. –

ответ

1

Вы можете использовать importlib импортировать модули, а затем присвоить имена функций динамически с помощью globals() и getattr:

from importlib import import_module 
for f in ["move","rename","mime_type"]: 
    import_module("."+f,"archive") #import archive.f 
    globals()[f]=getattr(globals[f],f) #assign the function f.f to variable f 

Как было предложено tdelaney, вы даже можете получить все имена модулей динамически с помощью glob:

from os.path import splitext,join,basename,dirname 
from glob import glob 
#get all *.py filenames in __file__'s folder that are not __file__. 
files=[splitext(f)[0] for f in glob(join(dirname(__file__), '*.py')) 
     if f != basename(__file__)] 
for f in files: 
    ... 
+0

Не могли бы вы привести мне пример? –

+1

Вы можете добавить 'glob.glob (" *. Py ")' и 'os.path.splitext', чтобы сделать еще один шаг. – tdelaney

+1

ну ... сделайте это 'glob.glob (os.path.join (os.path.basename (__ file__), '* .py'))', но общая идея была там. – tdelaney

0

Используйте 'как':

from archive import move.move as move 
from archive import rename.rename as rename 
from archive import mime_type.mime_type as mime_type 
+0

В чем разница? –

+0

, используя ключевое слово as, связывает локальное пространство имен для модуля. так что на импортированном вы можете вызвать move (x), а не move.move (x) – ANVGJSENGRDG

Смежные вопросы