使python导入更结构化?

2024-05-15 22:20:11 发布

您现在位置:Python中文网/ 问答频道 /正文

代码可以工作,但看起来很混乱,所以这可能是一个代码检查问题,在这里,我没有学习足够的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文件指定导入,或者类似地。


Tags: 文件djangofromimportapiosconfutil
3条回答

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

Explicit is better than implicit.

...

Namespaces are one honking great idea -- let's do more of those!

我还建议您阅读Python documentation on modules和关于Python namespaces的内容。

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

基本上,对于组织,您需要做的是:

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有一个“organize imports”命令。

一旦使用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不同,在每个类都是自己的文件时,Python方式是使每个模块(文件)尽可能独立,通常意味着它们包含多个类和函数。

相关问题 更多 >