Python 代码组织帮助:导入函数

Python code organization help: importing functions

我写了一些代码,但它们都在一个文件中。现在使用它有点烦人,因为它太长了。所以我想我应该把所有的功能放在一个不同的文件中,然后导入它们。我只是不确定执行此操作的最佳方法。

当前代码:

import glob, os
import csv as csv
import pandas as pd
import numpy as np
import sys

def create_list(var):      
    stuff
def store_table(var):
    stuff
def geo_info(var):
    stuff 
def factor_loads(var):
    stuff  
def add_loads(var):
    stuff 
def calc_bypass_stress(var):
    a lot of stuff
def calcloads(var): 
    tons of stuff and calls other functions above    

for i in list:
   for k in another_list:
       calcloads(var)

我想我可以将其拆分,以便执行查找和创建表的功能在 tables.py 中;任何计算东西的东西都在 calc_stuff.py 中,我 运行 来自 thehead.py:

的所有东西

tables.py

def create_list(var):      
    stuff
def store_table(var):
    stuff
def geo_info(var):
    stuff
def factor_loads(var):
    stuff
def add_loads(var):
    stuff

calc_stuff.py

def calc_bypass_stress(var):
    a lot of stuff
def calcloads(var): 
    tons of stuff and calls other functions above    

thehead.py

import glob, os
import csv as csv
import pandas as pd
import numpy as np
import sys
from tables import *
from calc_stuff import *

for i in list:
   for k in another_list:
       calcloads(var)

一些问题:

1) 这行得通吗?

2) 我的几乎所有函数都使用了 Pandas、Numpy 等的东西。我需要在每个 .py 文件中导入这些包吗?或者就在 thehead.py?

3) 从 thehead.py 我正在调用位于 calc_stuff.py 的函数 (calcloads),它使用位于 tables.py 的函数。我是否应该将所有函数保存在一个文件中,而不是将函数拆分到不同的文件中?

  1. 是的。
  2. 您需要在每个 .py 文件中导入包。
  3. 将功能拆分到不同的文件中不是问题。如果您的文件变得很长,那绝对是个好主意。

我觉得@tjohnson 的回答很好。我只想在问题 3 中添加一些内容。听起来您已经编写了很多函数,并且您正试图通过将不在 "active development" 下的函​​数放入某种库中来使您的代码/文件更易于管理.在那种情况下,是的,将您的函数存储在一组单独的文件中不是问题。但是,按照 "flat is better than nested" 原则,将它们全部放在一个很长的 .py 文件中,然后将 table 内容放在该文件的注释中,可能会提高查找的便利性,或在导入后即时打印 table 内容。

获取内容 table 的一种快速而肮脏的方法如下。假设您的超长文件名为 mymod1.py。然后你可以写:

编辑为简化:(使用 @kojiro here 的想法)

from mymod1 import * 
import mymod1 # to get it in the namespace
def my_toc(module):
    exclude = ['date','pprint'] # list of callables imported via `from foo import bar`
    for item in dir(module):
        if (item not in exclude and
            callable(getattr(module, item, locals().get(item)))):
            print(item)
my_toc(mymod1)

输出:

myfunc_1
myfunc_2
myfunc_3 # etc