学习pyqt5相关知识回顾

news2024/11/14 12:02:04

1. 模块

1.1 import导入

1) 模块:是一系列功能的集合体,模块名.功能名,就可以使用模块的功能

2) 首次导入模块,就会立即执行模块里面的内容

3) 当前名称空间会产生一个名字module,指向module.py产生的名称空间.我们可以使用module.name/函数名,来调用module.py里面的内容.

modlue.py文件的内存地址引用变为0的时候,该名称空间才会被回收.就是模块测试.py文件运行完毕的时候

4) 在函数内部导入模块,这个模块名是属于函数局部名称空间的,其他地方是访问不到的. 

5) 当module.py被直接运行的时候,__name__的值为__main__,当modlue.py作为模块导入时,__name__的值为模块名module.

1.2 from..import..导入

1) import导入后需要加模块名来调用模块里面的属性和功能.使用from导入后,就避免写前缀了.它会直接指向模块里面对应的功能或是变量值的内存地址.也就是说当前模块的name指向的是"张大仙"的内存地址,而不是name.

 2) from modlue import *,默认导入的就是__all__里面的名字.我们可以通过控制__all__的内容来控制导入的内容.

1.3 模块的查找顺序

1)现在内存找,内存找不到就到硬盘找。内存的查找路径是按照sys.path的列表里面依次查找的

 2)如果导入的模块和当前运行的程序不是在同一文件夹,那么可以将模块所在的文件夹,添加进入sys.path.再导入模块的时候,就可以被识别到。

3)只要在文件中间添加了此行代码,那么直接使用文件名就可以运行文件,不用再加python解释器。

 2.包

2.1 包的概念

1)包就是一个含有__init__.py文件的文件夹

2)导包的流程和导入模块的流程是一样的(导入包pack)

        ——创建名称空间(pack的名称空间)

        ——执行python文件(运行pack.py但是没有只能运行__init__.py)

        ——在执行的名称空间中产生一个名字,指向前面的名称空间(所以当前名称空间里面的pack指向的是__init__.py的名称空间)

2.2 绝对导入

1)所有被导入的文件的sys.path参照的都是执行文件的sys.path.也就是说__init__.py文件的执行路径也是'D:\\PythonData\\pythonProject\\module-7'.我们直接导入running.在sys.path里面是找不到的。它的路径下面只有game.所以导入的时候是从包的起始位置game进行导入。

但是所有的前提都是,使用者要将game所在的路径添加到环境变量里面去,不管是包被嵌套了多少层。

'D:\\PythonData\\pythonProject\\module-7\\mm\\tt“

2)导入规则

入包时凡是带.的,.的左边必须是一个包 

 

 2.3 相对导入

. 表示当前文件所在的文件夹就是__init__.py文件所在的文件夹。

.. 表示上一层文件夹

pay的当前文件夹是gg,上一层文件夹是game.从game找walking.

相对导入的范围不可超出顶级包game.

2.4 补充

如果在__init__.py文件里面并没有导入包下面的模块名,调用的时候可以直接导入logging.config,此时会先检索__init__.py里面有没有config,没有再找模块名.但是调用的时候就必须加上前缀logging.config. 

3.日志

3.1 日志基本配置

1) 日志的默认输出级别就是warning,warning以下的内容就不会输出.可以通过控制日志等级来控制日志输出 

2) 日志的基本配置包括(1.日志级别,2.日志格式,3.asctime,4.日志输出位置)

import logging

logging.basicConfig(
    # 1.日志级别
    # DEBUG:10
    # INFO:20
    # WARNING:30
    # ERROR:40
    # CRITICAL:50
    level=10,

    # 2.日志输出格式
    # %(asctime)s -> 获取当前时间
    # %(name)s -> 当前日志的名字
    # %(pathname)s -> 产生日志文件的名字
    # %(lineno)d -> 产生日日志的行
    # %(levelname)s -> 产生日志的等级
    # %(message)s -> 日志的详细内容
    format='%(asctime)s %(name)s [%(pathname)s line:%(lineno)d] %(levelname)s %(message)s',

    # 3、asctime的时间格式
    datefmt="%Y-%m-%d %H:%M:%S",

    # 4、日志输出位置:终端|文件,不指定此项配置,默认输出到终端
    filename="user.log"
)

# 日志的输出级别是可以设置的
logging.debug("debug")
logging.info("info")
logging.warning("warning")
logging.error("error")
logging.critical("critical")

输出日志的时候没有指定字符编码,所以默认使用的就是系统的编码方式.windows使用的gbk,mac和linux默认的就是UTF-8.pycharm默认是使用UTF-8打开的,所以对于windows电脑可能会出现乱码. 

2024-07-05 08:58:30 root [/Users/f7692281/PycharmProjects/other-stydy/日志/日志测试.py line:34] DEBUG debug
2024-07-05 08:58:30 root [/Users/f7692281/PycharmProjects/other-stydy/日志/日志测试.py line:35] INFO info
2024-07-05 08:58:30 root [/Users/f7692281/PycharmProjects/other-stydy/日志/日志测试.py line:36] WARNING warning
2024-07-05 08:58:30 root [/Users/f7692281/PycharmProjects/other-stydy/日志/日志测试.py line:37] ERROR error
2024-07-05 08:58:30 root [/Users/f7692281/PycharmProjects/other-stydy/日志/日志测试.py line:38] CRITICAL critical

3.2 日志配置字典

日志的基本配置可能会出现乱码的问题,并且不同将日志同时输出到文件和终端.

1)  loggers负责产生不同级别的日志,handlers负责处理不同级别的log,是输出到文件/终端,以..形式来产生log.formatters则是负责控制log的输出格式

2) 因为logging这个包在使用的时候,没有将congfig导入到__init__.py里面所以只能够使用logging.config() 

3) 可以使用没有名字的日志记录器,将多个log记录到同一个log里面.

4) 日志轮转

# _*_ coding utf-8 _*_
# george
# time: 2024/1/9上午10:46
# name: settings.py
# comment:
import logging

LOGGING_DIC = {
    "version": 1.0,
    "disable_existing_log": False,
    # 日志格式,这里可以指定多种日志格式,这里的standard...就是对应日志名字
    "formatters": {
        "standard": {
            "format": '%(asctime)s %(name)s [%(pathname)s line:%(lineno)d] %(levelname)s %(message)s',
            "datefmt": "%Y-%m-%d %H:%M:%S"},
        "simple": {
            "format": '%(asctime)s %(name)s %(levelname)s %(message)s',
            "datefmt": "%Y-%m-%d %H:%M:%S"},
        "test": {"format": '%(asctime)s %(message)s'}
    },
    "filters": {},
    # 日志处理器:将记录的日志进行处理(输出到文件/显示到控制台)
    # 可以设置多个handler不同的handler做不同的处理,做不同的配置
    "handlers": {
        "console_debug_handler": {
            "level": 20,  # 日志处理的级别限制
            "class": "logging.StreamHandler",  # 输出到终端
            "formatter": "simple",  # 日志格式
        },
        "file_info_handler": {
            "level": "INFO",
            'class': "logging.handlers.RotatingFileHandler",
            "filename": "deal.log",
            # 日志大小,10M,日志文件达到10M的时候进行轮转
            # 默认单位为字节,1KB 1024 Byte,1MB为1024KB
            "maxBytes": 800,
            "backupCount": 10,  # 日志文件保存数量的限制
            "encoding":"utf-8",
            "formatter":"standard"
        },
        "file_debug_handler": {
            "level": 10,
            "class": "logging.FileHandler",  # 保存到文件
            "filename": "test.log",  # 日志存放的路径
            "encoding": "utf-8",  # 日志文件的编码
            "formatter": "test"  # 日志格式
        },
        "file_deal_handler": {
            "level": 20,
            "class": "logging.FileHandler",  # 保存到文件
            "filename": "deal.log",  # 日志存放的路径
            "encoding": "utf-8",  # 日志文件的编码
            "formatter": "standard"  # 日志格式
        },
        "file_operate_handler": {
            "level": 20,
            "class": "logging.FileHandler",  # 保存到文件
            "filename": "operate.log",  # 日志存放的路径
            "encoding": "utf-8",  # 日志文件的编码
            "formatter": "standard"  # 日志格式
        }
    },
    # 日志记录器
    "loggers": {
        "logger1": {  # 导入时logging.getLogger时使用的app_name
            "handlers": ["console_debug_handler","file_info_handler"],  # 日志将要分配给哪个handler进行日志处理
            "level": "DEBUG",  # 日志记录的级别限制,和handlers里面的日志一起组成两层日志过滤
            "propagate": False  # 默认为True,向更高级别的日志进行传递
        },
        "logger2": {
            "handlers": ["console_debug_handler", "file_debug_handler"],  # 日志将要分配给哪个handler进行日志处理
            "level": "INFO",  # 日志记录的级别限制,和handlers里面的日志一起组成两层日志过滤
            "propagate": False  # 默认为True,向更高级别的日志进行传递
        },
        "": {
            "handlers": ["file_deal_handler","file_info_handler"],  # 日志将要分配给哪个handler进行日志处理
            "level": "INFO",  # 日志记录的级别限制,和handlers里面的日志一起组成两层日志过滤
            "propagate": False  # 默认为True,向更高级别的日志进行传递
        },
        "用户操作": {
            "handlers": ["file_operate_handler"],  # 日志将要分配给哪个handler进行日志处理
            "level": "INFO",  # 日志记录的级别限制,和handlers里面的日志一起组成两层日志过滤
            "propagate": False  # 默认为True,向更高级别的日志进行传递
        }
    }
}

4.configparser模块的读写

这个模块是用来加载一种特定格式的配置文件的.配置文件的后缀名为ini或是cfg是什么名字其实并不重要,只要让别人一看就知道你这是配置文件就可以了

  • [default]是这一部分配置的标题,名字可以随便起.是这个配置文件section.每个section里面的这些配置被叫做option.
  • 这些option的表现形式可以是=,也可以是:这两种做法都是被支持的.
  • 在这里写入的是什么就会被读取到什么.添加"",""也会被读取到.所以如果定义的option为空时,直接=后面什么都不加就可以了.

4.1 config模块的读取

# settings.ini配置
from configparser import ConfigParser
config = ConfigParser()
CONFIG_PATH = os.path.join(Base_Dir,"settings.ini")
config.read(CONFIG_PATH,encoding="utf-8")
login_user = config.get('default',"LOGIN_USER")
login_type = config.get('default',"LOGIN_TYPE")

4.2 config模块的写入

# -5.1 记录登陆的用户名和用户类型
settings.config.set("default", "LOGIN_USER", name)
settings.config.set("default", "LOGIN_TYPE", user_type)
with open(settings.CONFIG_PATH, mode="w", encoding="utf-8") as f:
        settings.config.write(f)

5.eval和exec

5.1 eval

eval主要是用来执行表达式的,它执行的代码需要一个返回结果

5.2 globals和locals 

globals()和locals() 

globals()获取的是全局名称空间里面所有的名字.

loacls()获取的是局部名称空间里面所有的名字,如果locals()在全局里面使用的话,拿到的结果和globals()是一致的,我们当前在全局,所以当前的局部就是全局.

5.3 eval剩余两个参数

  • g代表全局名称空间 
  • l代表局部名称空间
  • 现在可以将eval执行的代码想象为一段函数的子代码,g就是它能够访问到的全局名称空间,l就是它的全局名称空间.这两个参数其实都是为了往里面传参数的.如果不传全局名称空间的话,默认就会将所有全局空间里面的名字都传递进去

  • 我们不传第2和第3个参数的时候eval()是可以执行的,也就是说我们不定制全局名称空间和局部名称空间的时候.它默认会把所有全局的名字都传进去,就是globals()和locals().如果而我们定制了第2个参数,它只会传我们自定义的名字以及python内置的名字 

 

  • 表达式必须有返回值,如果没有返回值会直接报错 

5.4 exec

  • exec主要是用来执行代码块的,它的用法和eval是类似的,只是它是没有返回值的.
  • exec只会将字符串里面产生的名字,存到第三个参数里面如果我们直接在全局打印a是会报错的
  • 如果不传后面的两个参数,默认传递的就是globals()和locals(),字符串里面产生的名字会保存到locals()里面,而当前就是在全局,也就是说globals()就是locals()
  • globals()绑定了全局名称空间,locals()并没有绑定当前局部名称空间,只是一个拷贝版本的字典

 

 

5.5 系统攻击 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2125299.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机网络 --- 【1】欢迎来到计算机网络/计算机网络基本概念/计算机网络、互连网、互联网的区别

目录 一、计算机网络学什么? 二、 什么是计算机网络?计算机网络、互联网(因特网,Internet)、互连网(internet)之间的区别? 2.1 计算机网络的定义 2.2 计算机网络与互连网的区别 2.3 互连网 三、总结部分 一、计算机网络学…

从品牌战略到品牌知名度:实现持续增长和客户忠诚度的关键。

每家公司都希望自家的品牌、产品或服务能在市场上首屈一指。当你问创始人和CEO们他们的愿景时,他们常常会告诉你,他们想要成为行业中的“ 第一”或者成为“ 行业领袖”。 作为市场营销人员,我们都希望我们所运营的品牌能做到这一点——成为第…

python获取双色球数据解析

先用python GET网页源码 这里我们用GET参考的双色球频道_往期回顾​​​​​​ 因为不同的网站源码不一样,主要讲解思路 soup BeautifulSoup(html, html.parser) 用BS解析后,使用 lottery_info soup.find_all(tr)#根据tr标签找到开奖所有的期号行 先找到所有的tr行,因为…

线性方程组求解——预处理Preconditioning介绍

为什么需要预处理? 工程中出现的大规模线性方程组往往是病态的, 对数值求解带来很大的困难: ▶ 使得迭代法(比如Krylov 子空间迭代法) 收敛变得非常缓慢 ▶ 对数值解的精度产生很大的影响(在有限精度计算情形下) 对于第一个问题, 当前的有效处理方法是预处理, 预处…

AIO不止有群晖,极空间虚拟机部署免费开源的『TrueNAS』

AIO不止有群晖,极空间虚拟机部署免费开源的『TrueNAS』 哈喽小伙伴们好,我是Stark-C~ 很多小伙伴在买到极空间的NAS之后,总要各种折腾,毕竟配置高,硬件强,折腾起来也确实得心应手,乐趣多多。 …

Android相关线程基础

线程基础 进程与线程 进程:可以被看做是程序的实体, 是系统进行资源分配和调度的基本单位. 线程:是操作系统调度的最小单元, 也叫轻量级进程 使用多线程的优点 可以减少程序的响应时间。如果某个操作很耗时, 能够避免陷入长时间的等待, 从而有着更好的交互性. 线程较之进…

Android V 广播注册和配置注意事项问题

现象 在Android V平台上,应用注册非Protected广播时,如果没有加导出flag会抛出异常导致进程crash。 E/AndroidRuntime: FATAL EXCEPTION: main java.lang.SecurityException: com.demo.myapplication: One of RECEIVER_EXPORTED or RECEIVER_NOT_EXPORT…

【运维监控】Prometheus+grafana监控zookeeper运行情况

本示例通过zookeeper自带的监控信息暴露出来,然后将数据收集到prometheus中,最后通过grafana的dashboard导入模板进行可视化。本示例分为三个部分,即prometheus、grafana部署和最后的集成。说明:本示例中的部署环境没有要求&#…

BC173 牛牛逆序输出(c 语言)

1.// 描述 //牛牛在尝试把一个整数逆序地输出。 //输入描述: //输入一个正整数 n。保证个位数不是 0 //输出描述: //逆序输出这个正整数。 //2345 //5432 2.我们先输入n,然后我们进行取余,然后将余数存储起来在arr中,然后除10。…

用 Python 和 Tkinter 做游戏?5分钟打造Python贪吃蛇游戏

大家好!贪吃蛇游戏是一款经典的休闲游戏,相信大家都不陌生。 今天,我们将用 Python 的 Tkinter 库快速创建一个贪吃蛇游戏。你不需要成为一个编程专家,只需跟着本文的步骤走,你就可以亲手制作属于自己的贪吃蛇游戏&am…

TikTok Shop9.9大促爆单忙不过来?EasyBoss ERP给你全方位的助力!

又是一年9.9大促,想必大多数Shopee/TikTok本土卖家的店铺订单量都远超日常了吧? 图源:网络 爆单是件大好事,但背后却是店铺运营的一场硬仗。因为出单后,多店铺的订单处理、仓库发货、售后、数据分析等环节都有大量的工…

QEMU虚拟机

vmware中创建虚拟机 创建虚拟磁盘 qemu-img create -f qcow2 sda.qcow2 100G qemu-img create -f qcow2 sdb.qcow2 100G创建桥接口 brctl addbr br0 brctl addif br0 ens36 brctl stp br0 on ifconfig ens36 0 dhclient br0brctl addbr br1 brctl addif br1 ens37 brctl stp …

信息安全工程师(3)TCP/IP协议簇

前言 TCP/IP协议簇是Internet的基础,也是当今最流行的组网形式。它不仅仅指的是TCP和IP两个协议,而是由一系列协议组成的协议簇,这些协议共同支持着互联网上的数据传输和通信。以下是对TCP/IP协议簇的详细概述: 一、组成 TCP/IP协…

什么是期权对冲?

今天期权懂带你了解什么是期权对冲?期权对冲的选择取决于投资者的市场预期和风险承受能力,通过合理使用期权对冲策略,可以有效减少风险并优化投资组合的表现。 期权对冲是什么? 期权是一种支持双向交易的投资产品,期…

【Go】Go语言中的基本数据类型与类型转换

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

报告 | 中国信通院《大模型落地路线图研究报告(2024年)》(附下载)

前言 近年来,以大模型为代表的新一代人工智能技术加速迭代,向着更为智能化、通用化、普惠化的方向迈进,成为新一轮科技和产业变革的重要驱动力。然而,当前大模型发展仍存在工程实践复杂、技术选型困难、能力评估不全面等问题&…

基于 TDMQ for Apache Pulsar 的跨地域复制实践

导语 自2024年9月6日起,TDMQ Pulsar 版专业集群支持消息、元数据两级跨地域复制功能,消息级复制解决用户全球地域的数据统一归档问题,元数据级复制提供解决用户核心业务跨地域容灾的场景。 用户在跨地域场景遇到的疑问和挑战 在跨地域相关…

FCP-D 报表交付认证考试题

学习目标 帆软 基础知识:通过系统学习,了解帆软BI的基本概念、架构和功能。深入理解报表设计、数据集成和分析等关键模块,为将来的实际应用奠定坚实基础。 报表设计与定制学习如何设计各类报表,包括但不限于表格、图表、仪表盘等。…

springboot luttuc redis 集成protobuf,手动序列化反序列化

前置需知: 1.本文章和网上大部分博客配置不太一样,各位看官要分析一下自己的需求。集成protobuf 本文章主要是手动调用protobuf的序列化方法,而不是交由springboot 去做,会偏向原生java 使用方式 2.由于为了和公司其他的项目达成…

QQueue调用dequeue闪退解决方法

QQueue调用dequeque闪退的解决方法 先看一下Qt帮助文档里面的说明 这个函数假设队列不是空的。 那么我们在调用之前,需要先判断队列是不是空的,如果不是空的,就调用该函数。 if (!queue.isEmpty()) {QString info queue.dequeue(); }这样…