zoukankan      html  css  js  c++  java
  • day 21

    创建目录代码

    1. 无论是 import 形式还是 from...import 形式,凡是在导入语句中(而不是在使用时)遇到带点的,都要第一时间提高警觉:这是关于包才有的导入语法
    2. 包是目录级的(文件夹级),文件夹是用来组成py文件(包的本质就是一个包含__init__.py文件的目录)
    3. import 导入文件时,产生名称空间中的名字来源于文件,import 包,产生的名称空间的名字同样来源于文件,即包下的 __init__.py ,导入包本质就是在导入该文件
    强调:
      1. 在python3中,即使包下没有 __init__.py 文件,import 包仍然不会报错,而在 python2 中,包下一定要有该文件,否则 import 包报错
      2. 创建包的目的不是为了运行,而是被导入使用,记住,包只是模块的一种形式而已,包即模块
    注意:
    1. 关于包相关的导入语句也分为 import 和 from ... import ... 两种,但是无论哪种,无论在什么位置,在导入时都必须遵循一个原则:凡是在导入时带点的,点的左边都必须是一个包,否则非法。可以带有一连串的点,如 item.subitem.subsubitem,但都必须遵循这个原则
    2. 对于导入后,在使用时就没有这种限制了,点的左边可以是包,模块,函数,类(它们都可以用点的方式调用自己的属性)

    如下建立的包

    import os
    os.makedirs('E:/py/bao/api')
    os.makedirs('E:/py/bao/cmd')
    os.makedirs('E:/py/bao/db')
    l = []
    l.append(open('E:/py/bao/__init__.py','w'))
    l.append(open('E:/py/bao/api/__init__.py','w'))
    l.append(open('E:/py/bao/api/policy.py','w'))
    l.append(open('E:/py/bao/api/versions.py','w'))
    l.append(open('E:/py/bao/cmd/__init__.py','w'))
    l.append(open('E:/py/bao/cmd/manage.py','w'))
    l.append(open('E:/py/bao/db/models.py','w'))
    l.append(open('E:/py/bao/db/__init__.py','w'))
    map(lambda f:f.close() ,l)

    如下的一个目录结构

    glance/                   
    
    ├── __init__.py     from .api import *
                           from .cmd import *
                           from .db import *    
    ├── api                  
    
    │   ├── __init__.py   __all__ = ['policy','versions'] 
    
    │   ├── policy.py
    
    │   └── versions.py
    
    ├── cmd               __all__ = ['manage']    
    
    │   ├── __init__.py
    
    │   └── manage.py    
    
    └── db                __all__ = ['models']              
    
        ├── __init__.py
    
        └── models.py
    
    
    import glance
    policy.get()

    接下来我们来尝试调用模块

    import bao.api.policy as policy
    policy.get()
    
    from bao.api import policy #import 后面不能带“.”什么
    policy.get()
    
    import sys
    print(sys.path) #查看配置路径
    
    ##我们尝试 import 包,然后使用其下面的方法
    #原因是:当导入一个包时,一定执行包下面的 __init__.py 文件,此时我们改文件为空
    import bao
    bao.api.policy.get() #报错  AttributeError: module 'bao' has no attribute 'api'
    
    #然后我们要做的就是在没一级包中的 __init__.py 中导入要用到的下一级的包,需要注意的是 sys.path 的路径

    我们在 __init__.py 中导入包时

    from bao.api import policy #绝对路径
    from . import policy #相对路径

    绝对路径:
      使用绝对路径 不管在包内部还是外部 导入了就能用
      不能挪动,但是直观
    相对路径:(当使用一个成熟的包时使用)
      可以随意移动包 只要能找到包的位置,就可以使用包里的模块
      包里的模块如果想使用其它模块的内容只能使用相对路径,使用了相对路径就不能在包内直接执行了

    ## __all__ 与 from ... import * 配合的导入方式
    #可以忽略中间一层的文件名

    异常处理

    先来看一串代码,后面在慢慢解释

    try:
        print('1111')
        # 1/0
        print('2222')
        # name
        # 2+'3'
        # [][3]
        # {}['k']
        ret = int(input('number >>>'))
        print(ret*'*')
    except ValueError:
        print('输入的数据类型有误')
    except Exception:
        print('你错了,老铁')
    else:
        print('没有异常的时候执行else中的代码')
    print('===========')
    
    def func():
        try:
            f = open('file','w')
            return True
        except:
            return False
        finally:
            print('执行 finally 了')
            f.close()
     print(func())

    程序一旦发生错误,就从错误的位置停下来了,不在继续执行后面的内容
    使用 try 和 except 就能处理异常
      try 是我们需要处理的代码
      except 后面跟一个错误类型 当代码发生错误且错误类型符合的时候 就会执行 except 中的代码
      except 支持多分支
      有没有一个能处理所有错误的类型:Exception
        有了万能的处理机制仍然需要把能预测到的问题单独处理
        单独处理的所有内容都应该写在万能异常之前
      else:没有异常的时候执行 else 中的代码
      finally:不管代码是否异常,都会执行
        finally 和 return 相遇的时候 依然会执行
        函数里做异常处理用,不管是否异常去做一些收尾工作

    在 Exception 后加上 error

    try:
        print('1111')
        # 1/0
        print('2222')
        # name
        # 2+'3'
        # [][3]
        # {}['k']
        ret = int(input('number >>>'))
        print(ret*'*')
    except Exception as error:  #在使用万能异常处理时,加上 error 可以显示报错信息
        print('你错了,老铁',error)
  • 相关阅读:
    【quickhybrid】架构一个Hybrid框架
    基于socket.io打造hybrid调试页面
    【图像缩放】双立方(三次)卷积插值
    搭建apache本地服务器·Win
    PHP、mySQL及Navicat安装·Mac
    搭建apache本地服务器·Mac
    博客前端live2D实现
    docker镜像下载出现:received unexpected HTTP status: 500 Internal Server Error
    第一篇
    [java]静态方法访问非静态方法的方法
  • 原文地址:https://www.cnblogs.com/ysging/p/10223324.html
Copyright © 2011-2022 走看看