使python导入更有条理?

时间:2011-09-10 19:32:31

标签: python import

代码有效,但看起来很乱,所以这可能是一个代码审查问题,我没有研究足够的pythons约定,知道如何构建和组织我的文件的开头更pythonic。我基本上只是粘贴在进口中,所以它们可能是重复的,不再需要或错误订购。你能告诉我如何构建我的导入的任何建议吗?或者我可以留下这样的代码来专注于我自己的功能吗?

文件1:

from __future__ import with_statement
import logging
import os
from google.appengine.api.users import is_current_user_admin, UserNotFoundError
import time
import cgi
import geo.geotypes
import main
import captcha
from google.appengine import api
from google.appengine.runtime import DeadlineExceededError
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.ext.blobstore import BlobInfo
from google.appengine.ext.db import djangoforms
from django import forms
from django.core.exceptions import ValidationError
from django.utils import translation
from datetime import datetime, timedelta
os.environ['DJANGO_SETTINGS_MODULE'] = 'conf.settings'
from django.conf import settings
from django.template import RequestContext
from util import I18NHandler
import util
from google.appengine.api import urlfetch, taskqueue
from django.template.defaultfilters import register
from django.utils import simplejson as json
from functools import wraps
from google.appengine.api import urlfetch, taskqueue, users, images
from google.appengine.ext import db, webapp, search, blobstore
from google.appengine.ext.webapp import util, template
from google.appengine.runtime import DeadlineExceededError
from random import randrange
import Cookie
import base64
import cgi
import conf
import datetime
import hashlib
import hmac
import logging
import time
import traceback
import urllib
import twitter_oauth_handler
from twitter_oauth_handler import OAuthClient
from geo.geomodel import GeoModel
from django.utils.translation import gettext_lazy as _
webapp.template.register_template_library('common.templatefilters')

文件2(这里有几条说明,我不明白):

from __future__ import with_statement
                # -*- coding: utf-8 -*-
import facebookconf
import os, wsgiref.handlers
os.environ[u'DJANGO_SETTINGS_MODULE'] = u'conf'
import util
import time
import logging
import urllib
import wsgiref.handlers
import appengine_admin
import cgi
import captcha
import re
import hashlib
import string
import hmac
import twitter_oauth_handler
from twitter_oauth_handler import OAuthClient
os.environ['DJANGO_SETTINGS_MODULE'] = 'conf.settings'
from geo.geomodel import GeoModel
from google.appengine.dist import use_library
from google.appengine.ext import blobstore, webapp, db, search
# template import must be run before other Django modules imports
from google.appengine.ext.webapp import blobstore_handlers, util, template
from google.appengine.ext.blobstore import BlobInfo
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.api import files, images, mail, memcache, users
from django.conf import settings
# Force Django reload
settings._target = None
from util import I18NHandler, FacebookBaseHandler
from google.appengine.ext.db import djangoforms
from django.utils import translation
from django.utils import simplejson as json
from django.contrib.formtools.preview import FormPreview
from random import choice
from urllib import quote
from google.appengine.api.users import is_current_user_admin, UserNotFoundError
from google.appengine.api import urlfetch
import random
import datetime
from datetime import timedelta
from django.utils.translation import gettext_lazy as _
from django.template import defaultfilters

如何移动或移除功能后,何时不知道导入何时使用?为什么我不能在一个地方为多个文件指定相同的导入,我必须在两个文件中指定相同的导入?我可以想象将处理导入移动到单独的文件,即imports.yaml,以指定该目录中的所有python文件的导入或同样。

6 个答案:

答案 0 :(得分:10)

PEP 8 - Style Guide for Python code建议按以下顺序订购您的导入:

1. Standard library imports
2. - blank line -
3. google sdk imports
4. - blank line -
5. django imports
6. - blank line -
7. your own code imports

仅导入您在代码中使用的内容。删除未使用的导入您可以使用其中一种工具来检测未使用的导入:Pydev on Eclipse / pyflakes / pylint

你有很多进口商品。你的实际代码有多大?将它分成几个模块可能是个好主意。

为什么不能在单个文件中导入单个时间?那么你实际上可以这样做:

WARNING: THIS EXAMPLE ILLUSTRATES BAD CODING PRACTICES

import_all.py:

    import a
    import b
    import c

other.py:

     from import_all import *

但请不要这样做。这违反了Python开发的所有良好做法,反对The Zen of Python

  

明确比隐含更好。

     

...

     

命名空间是一个很好的主意 - 让我们做更多的事情!

我还建议您阅读Python documentation on modules以及有关Python namespaces的内容。

答案 1 :(得分:8)

一旦您使用pylint识别重复和未使用的导入,并根据其他答案建议的PEP8组织它们,您可以通过更改导入包的方式进一步清理它。

而不是

from google.appengine.api import urlfetch, taskqueue, users, images

你可以做到

from google.appengine import api

然后你需要在任何地方使用“api.urlfetch”,“api.taskqueue”等。

这不是“正确”的方式,它只是另一种方式。你必须选择你喜欢的那个。

另请注意,您可以使用别名:

from google.appengine import api as gaeapi

现在你要放“gaeapi.urlfetch”。如果您需要从多个包中导入名为“api”的模块,这非常有用。

另外,回答你的问题“为什么我不能在一个地方为多个文件指定相同的导入,我必须在两个文件中指定相同的导入?”,如果你在多个文件中导入相同的包,这可能表明这些文件密切相关,应该合并到一个文件中。与C ++或Java不同,每个类都是自己的文件,pythonic方法是使每个模块(文件)尽可能自包含,这通常意味着它们包含多个类和函数。

答案 2 :(得分:3)

PEP8有一个关于Imports的部分(我无法直接链接)。

基本上,对于组织,这是你想要做的事情:

Imports should be grouped in the following order:

1. standard library imports
2. related third party imports
3. local application/library specific imports

You should put a blank line between each group of imports.

哦,我相信PyDev for Eclipse有一个“组织导入”命令。

答案 3 :(得分:2)

  

为什么我不能在一个地方为多个文件指定相同的导入,我必须在两个文件中指定相同的导入?

只回答这个问题:你可以。

all_imports.py
--------------
import google.appengine as gae
import geo
import catptcha

other.py
--------
from all_imports import *

使用`from ... import *'是不好的做法,如果处理不当(例如,以这种方式导入五个模块),因为你的模块名称空间中有很多名称,并且很难找到变量的位置/ function / class来自。

如果处理得当(例如在这个例子中),它可以是一个很好的工具(gae来自哪里?哦,它必须在all_imports ......我会检查那里......)

答案 4 :(得分:2)

我不担心。进口的那些东西不应该被这样读,而是提供一个交叉引用:当有人遇到一个不合格的标识符进一步向下,并想知道它来自哪里时,他们可以向后搜索第一次出现,并且如果它没有在文件中本地定义,它们应该在import语句中提及它将告诉它们来自何处。

相反,您可以通过从导入中搜索转发来检查哪些导入未使用,以查看是否有任何提及的导入标识符;如果没有,那么删除它应该是安全的。

请注意,这不适用于通配符导入。不要使用通配符导入。

答案 5 :(得分:1)

除了上面的答案外,除了PEP8之外,我们还想按字母顺序组织事情(但导入来自于)是这样的:

# 1. standard libraries alphabetical with 'imports' before 'from' like this:
import csv
import logging
from collections import defaultdict
from datetime import date
#(blank line)

# 2. third party packages alphabetical with imports first
# next is the third party packages (also alphabetical as described above)
import numpy as  np 
import pandas as pd
from statsmodels import api as sm
#(blank line again)

# 3. your own stuff (also alphabetical) 
from my_other_folder import my_other_file