• 关于

    引入Python文件

    的搜索结果

问题

python怎么引入一个文件

python怎么引入一个文件...
云计算小粉 2019-12-01 20:05:15 644 浏览量 回答数 3

回答

你好python launcher 是 python 3.3 为windows引入的。py.exe,console 程序,启动 python.exe,关联到 .py 文件。pyw.exe,非 console 程序,启动 pythonw.exe,关联到 .pyw 文件。卸载python时,不卸载python launcher,python launcher单独卸载。作者:丽鸟链接:https://www.zhihu.com/question/264343132/answer/279853419来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
大财主 2019-12-02 01:06:42 0 浏览量 回答数 0

问题

__future__语句如何知道新python版本的语法?

我遇到了有关* future *模块如何工作的问题。 什么是未来在Python中,如何/何时使用它,以及它是如何工作 和 未来的进口如何运作。 但是我仍然不明白的是,今天的解释器是如何创建的...
is大龙 2020-03-24 21:30:23 1 浏览量 回答数 1

阿里云爆款特惠专场,精选爆款产品低至0.95折!

爆款ECS云服务器8.1元/月起,云数据库低至1.5折,限时抢购!

回答

OSS(Object Storage Service,即对象存储服务),是阿里云对外提供的海量,安全,低成本,高可靠的云存储服务。自公司产品v2.0版本之后,开始引入使用该服务。 在产品v1.0版本持续的使用中,产生了大量的用户数据及图片资源等文件。图片资源主要存放在阿里云ECS主机的特定目录中。在每次进行系统升级时,就需要进行数据备份,而备份的数据中,其中很大的一部分内容为图片资源文件。在v2.0版本开始,我们将app应用中使用到的图片资源、网页资源等信息存放在oss之上。这样当进行系统升级时,需要备份的数据,就完全不需要再去备份图片资源文件,减小了备份文件的大小及备份的大量耗时。 在使用了oss之后,就需要将v1.0版本上产生的图片资源文件完全迁移到oss中。由于oss提供了Python语言的sdk来操作oss。故选用了python作为开发工具,来实现图片资源文件的迁移。 开发环境为CentOS 6.4。 1.检查python开发环境 在控制台下执行命令:python 则说明python已经存在。如果输出内容为:command not found,则说明python未安装。安装python命令为:yum install python,执行了上述命令后,将开始安装python。 2.检查是否存在pip和setuptools pip和setuptools均为python包管理工具,执行pip,若没有该命令,需要进行安装。在centos下,目前这两个工具都不能直接通过yum来进行安装。可以在该链接中: https://pip.pypa.io/en/stable/installing/ 下载get-pip.py脚本,使用命令:python get-pip.py,将完成pip和setuptools工具的安装。 3.安装oss2 最新的oss sdk为oss2,且不能兼容之前的版本,执行命令:pip install oss2,将完成oss2的安装。 4.检查oss2环境是否配置完成 输入命令:python 输入如下内容:import oss2,回车。 输出上述内容,则说明oss2开发环境已经创建完成。 “答案来源于网络,供您参考”
牧明 2019-12-02 02:15:25 0 浏览量 回答数 0

回答

python 先加载__init__里面的类名 , 别人都把它引入到__init__.py这个文件了 , 你只需要引入之后 , 就会看到 啊
lookbigman 2019-12-02 02:24:47 0 浏览量 回答数 0

问题

【python学习全家桶】263道python热门问题,阿里百位技术专家答疑解惑

阿里极客公益活动:或许你挑灯夜战只为一道难题或许你百思不解只求一个答案或许你绞尽脑汁只因一种未知那么他们来了,阿里系技术专家来云栖问答为你解答技术难题了他们用户自己手中的技术来帮助用户成长本次活动特邀百位阿里技术专家对python常见问题进...
管理贝贝 2019-12-01 20:07:21 7217 浏览量 回答数 2

回答

作者:KJ(Kan Jia)链接:https://www.zhihu.com/question/21893155/answer/29567372来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。几年前刚刚初学python的时候, 也在pygame, panda3D, 和cocos2d-python之间犹豫过.多年以后, 自己实际上也没走上游戏这个行业, 但是现在看这样的问题顿时觉得轻松很多. 偶尔需要用python写一些桌面上的类游戏的效果, cocos2d-python版本成为我的(玩票)首选. 当然如果你是以游戏开发作为终身事业, 或者希望在游戏公司找一份工作, 那么你应该换一种学习路径...首先是pygame, panda3d这样的框架和cocos2d-python的比较: 第一大小, cocos2d-python的文件大概1.4M, 依赖的pyglet大概6M(解压缩以后). 这点绝对是panda3d这样的大家伙搞不定的, pygame, 压缩包大概1.4M, 另外还有一大堆依赖包, 比如pysdl...其实这里面还有更加深刻的差别. pygame的设计和实现在2000年左右, cocos2d则出现在2008年. 从技术上, pygame依赖的是pyopengl这样的库, 而cocos2d则依赖pyglet.传统的pyopengl这样的库用的是什么做法. 一般来说, 就是将原来C语言的dll编译成适合python调用的模块(也是dll/so的形式), 所以如果你用pip或者通过源码安装pyopengl这样的库的时候, 往往需要调用gcc, 需要安装好python-dev, 需要opengl-dev, 最后生成给你一个只能在python中import的dll.pyglet为什么不同呢? 因为在它被写出来的前几年, python世界里面有一个叫ctypes的东东出现了, 不久居然被python2.5收入了标准库, 变成了可以被直接import的东西. 通过这样一个神奇的标准库, 在python中可以直接打开dll文件调用其中的函数...于是, pyglet这个库, 它全部是用python语言写了一套opengl的包装. 事实上你根本不用安装gcc编译器就能安装好pyglet这个库. 更直接的说, 从网上下载下来解压缩, 把包copy到你的项目中即可.cocos2d-python, 也是纯python写的, 没有任何binary... 这意味着, 你写一个游戏, 然后将cocos和pyglet放在同一个目录下面, 接下来, 只要是装有python2.7的mac/linux/windows, 都可以直接跑起来. 这就是干净...说完了技术上的维度, 我们再来谈谈理念上的pygame和cocos2d都有sprite的概念, 但是使用方便性上是不一样的. pygame里面基本上就是一个层, 所有的操作, 比如旋转, 缩放, 都需要引入transform来处理. 而cocos2d的layer已经能够直接旋转, 缩放了. 接下来, 在cocos2d里面, 层出不穷的action让我们感受到了无与伦比的方便. 各种action组合, 比如一边移动一边旋转, 这才是现代的游戏framework.我个人以为, 很多东西都是相通的, 如果你是cocos2d-python的程序员, 只要这些理念上理解了, 应该不妨碍做iphone或者html5去写程序. 估计就是换成flash或者sprite kit, 一样很快上手.所以, 作为一个偶尔用用的游戏框架票友, 我最近真的用cocos2d-python写了一些桌面上的东东.关于文档少的问题, 确实cocos2d-python被冷落好久了, 因为cocos2d-x什么都包含, 包括各种desktop. 但是我看了看框架代码和游戏的example, 基本上很快摸索出来了.
xuning715 2019-12-02 01:10:22 0 浏览量 回答数 0

回答

首先要引入库import fcntl打开一个文件f = open('./test')对该文件加密:fcntl.flock(f, fcntl.LOCK_EX)这样就对文件test加锁了,如果有其他进程要对test进行加锁,则不能成功,会被阻塞,但不会退出程序。解锁:fcntl.flock(f,fcntl.LOCK_UN)解锁后,其他进程就可以对该文件进行加锁了。另外还有一种共享锁:acquire a shared lockfcntl.flock(f,fcntl.LOCK_SH)文件加锁捕捉异常[python] view plain copy 1 #!/usr/bin/env python 2 #coding:utf-8 3 """ 4 文件锁测试 5 """ 6 7 import fcntl 8 import time 9 10 try: 11 fp = open('_filelock','w') 12 fcntl.flock(fp.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB) 13 print '文件锁开始执行' 14 time.sleep(50) 15 fp.close() 16 except IOError: 17 print "lock"
xuning715 2019-12-02 01:10:40 0 浏览量 回答数 0

回答

你说的应该是引入一个py文件吧。 也叫python模块 from xxx import xxx import xxx
游客aasf2nc2ujisi 2019-12-02 03:21:10 0 浏览量 回答数 0

回答

用python import 来导入自定义模块和外部文件,例如:1、将外部文件放到跟需要调用外部文件的文件同一个包下,同一目录。 a.py 中引入 b.pyimport b 或 from b import *2、导入文件在其他目录中,如 folder 中。在folder 下新建一个__init__.py 的空文件,此时的folder不再是一个普通的文件夹,而是一个包 package。import folder.b 或 from folder.b import *3、将要被调用的代码拷贝到$PYTHONHOME$Libsite-packages 下面4、在$PYTHONHOME$Libsite-packages 下面新建一个.pth文件,里面的内容是你的包的绝对路径比如:E:/PythonPrj
xwaby 2019-12-02 01:09:29 0 浏览量 回答数 0

回答

在一个.py文件中,如果不是在定义函数,也就是说不是在def关键字的内嵌结构内,python会默认其余部分函数是main函数,并自动执行,但正规工程中,一般都会将main函数写为:if__name__==__main__每个人都在写,但很少有人问,其实这个用法很巧妙! ?12345678#hello.pydef sayHello(): str="hello" print(str); if name == "__main__": print ('This is main of module "hello.py"') sayHello()</code> 单独执行 当单独执行该module时,比如单独执行以上hello.py: python hello.py,则输出 ?12This is main of module "hello.py"hello可以理解为”if name==”main“:” 这一句与c中的main()函数所表述的是一致的,即作为入口 用作引用时 当该module被其它module 引入使用时,其中的”if name==”main“:”所表示的Block不会被执行,这是因为此时module被其它module引用时,其name的 值将发生变化,name的值将会是module的名字。比如在python shell中import hello后,查看hello.name: ?1234>>> import hello hello.__name__'hello' 因此,在python中,当一个module作为整体被执行时,moduel.name的值将是”main“;而当一个 module被其它module引用时,module.name将是module自己的名字,当然一个module被其它module引用时,其 本身并不需要一个可执行的入口main了。可以说python中的这种用法很灵活啊。
xuning715 2019-12-02 01:10:22 0 浏览量 回答数 0

回答

两点可以试试: 1.看着coding后面的冒号像是中文的,格式写对 2.看看文件的编码格式是不是utf-8的######回复 @阿有哥 : 我不玩python,机子上没环境 你可以写个helloworld编译下,然后拷贝代码到可以编译的文件######coding后面的冒号已经改为英文了,文件编码也确定是UTF-8的 依然还是不行,不知道那里错了,或者你能把这边代码复制到你的机子上 转换下EXE 看有没有出现和我一样的错误吗?###### 通过.spec文件打包试一下######tx是我要转成exe的源文件######回复 @阿有哥 : tx是什么?是你引入的文件吗######也还是一样 提示报错。
爱吃鱼的程序员 2020-05-29 13:08:50 0 浏览量 回答数 0

回答

两点可以试试: 1.看着coding后面的冒号像是中文的,格式写对 2.看看文件的编码格式是不是utf-8的######回复 @阿有哥 : 我不玩python,机子上没环境 你可以写个helloworld编译下,然后拷贝代码到可以编译的文件######coding后面的冒号已经改为英文了,文件编码也确定是UTF-8的 依然还是不行,不知道那里错了,或者你能把这边代码复制到你的机子上 转换下EXE 看有没有出现和我一样的错误吗?###### 通过.spec文件打包试一下######tx是我要转成exe的源文件######回复 @阿有哥 : tx是什么?是你引入的文件吗######也还是一样 提示报错。
优选2 2020-06-05 14:29:19 0 浏览量 回答数 0

回答

两点可以试试: 1.看着coding后面的冒号像是中文的,格式写对 2.看看文件的编码格式是不是utf-8的######回复 @阿有哥 : 我不玩python,机子上没环境 你可以写个helloworld编译下,然后拷贝代码到可以编译的文件######coding后面的冒号已经改为英文了,文件编码也确定是UTF-8的 依然还是不行,不知道那里错了,或者你能把这边代码复制到你的机子上 转换下EXE 看有没有出现和我一样的错误吗?###### 通过.spec文件打包试一下######tx是我要转成exe的源文件######回复 @阿有哥 : tx是什么?是你引入的文件吗######也还是一样 提示报错。
爱吃鱼的程序员 2020-05-29 16:45:10 0 浏览量 回答数 0

回答

两点可以试试: 1.看着coding后面的冒号像是中文的,格式写对 2.看看文件的编码格式是不是utf-8的######回复 @阿有哥 : 我不玩python,机子上没环境 你可以写个helloworld编译下,然后拷贝代码到可以编译的文件######coding后面的冒号已经改为英文了,文件编码也确定是UTF-8的 依然还是不行,不知道那里错了,或者你能把这边代码复制到你的机子上 转换下EXE 看有没有出现和我一样的错误吗?###### 通过.spec文件打包试一下######tx是我要转成exe的源文件######回复 @阿有哥 : tx是什么?是你引入的文件吗######也还是一样 提示报错。
爱吃鱼的程序员 2020-06-01 14:52:02 0 浏览量 回答数 0

回答

在升级SSH的jar包的时候出现的错误,不知道是什么原因。 importorg.apache.commons.lang.xwork.StringUtils;这里导入报错,请问这个文件属于哪个包呢、? 现在还在做Python开发么?还在北京否?很高兴认识你,如果还在做技术的话,有机会可以加QQ交流哦:1524583347把那个dao的代码贴出来应该是注入报错重新引入了lang3包。可以了。多谢。
爱吃鱼的程序员 2020-06-15 19:29:18 0 浏览量 回答数 0

回答

1.语法错误, printo改为print 2.在py文件最后加上如下代码,然后通过pythonXXX.py调用 if__name__=='__main__':the_list=[]newheart(the_list) 目测两个问题: 1没有调用newheart的语句 2 缩进不对 两个建议:  1 以后提问题要贴出完整的代码和测试步骤 2 贴出报错信息 好的谢谢啊, 目测printo还是不成从根本上来说: 1.找一本不坑人的、带代码例子的书 2.从头看起,别跳着看 Python3.4代码: defnewheart(the_list):foreachinthe_list:ifisinstance(each,list):print(each)else:print(each)newheart([1,2,3])运行结果: 谢谢解决了,出现了新问题就是安装模块导入后没有生成pyc文件我看的教程是Headfirstpython,引入包后没有生成pyc文件
爱吃鱼的程序员 2020-06-14 17:42:39 0 浏览量 回答数 0

问题

GitHub安全新机制:开发者引入不安全的库时会出现安全告警

代码托管服务商GitHub增加了新功能,现在它能够警告开发人员他们的项目中有存在漏洞的软件库,并且会提出修复方法解决问题。 GitHub最近引入了依赖关系图,该功能会列出项目使用的所有库。新...
正禾 2019-12-01 21:44:35 2436 浏览量 回答数 0

回答

 慢查询? ######回复 @ddfdfdf : 我也碰到了######回复 @最爱不懂 : 什么原因我也碰到了这个######回复 @狂热的猴子 : 猴哥你在逗我呀, 这么快就找到了######J哥 找到原因了######这他妈的waiting时间就是处理数据的时间  请求到达服务器  服务器根据请求内容去执行程序  神马引入文件 载入类什么的  都在这段时间内执行   得出结果后  反馈回来  尼玛~怪不得时间这么长 框架复杂度问题  越复杂的框架 请求时间越长 我勒个嚓嚓嘣!!!!!######回复 @布洛克斯 : 我在想办法降低等待时间 看看有没有什么办法 因为这问题困扰我很久了######回复 @狂热的猴子 : 猴哥这是精益求精做大项目的节奏啊######回复 @布洛克斯 : J哥 我用几个框架都测试了 ZF Symfony ThinkPHP Codeigniter Yii 统统走了不下10遍 每次请求完成后 都用xdebug记录 看了文件引用 类库加载 我去~这些时间加起来 刚好就是waiting时间######为啥我的一个css有14秒的TTFB######ZF、drupal惹的祸呀, 缓存吧###### 什么原因, 我也遇到了, 我静态资源也很长时间  ######其原因大多在于 程序文件加载 类加载 我用php xdebug查的时候 很多时间耗在include上面 还有一些初始化的工作上 so 非常纠结 最近我看了一些可以编写常驻内存项目的语言 比如java python 就不存在这个问题 资源不会被释放掉 也就不存在反复引入文件等初始化操作了######我至今未能解决这个问题###### ipv6 host文件没有映射localhost######回复 @文墨 : 试了一下,好像还真是,直接配IP速度就会快,不会再出现waiting 1min的问题了######mark 解决,感谢,nginx 的 localhost 里使用127.0.0.1 而不是使用对应服务器的域名 速度成功加快###### 上面的方法能解决一些情况,还有一些情况解决不了。
爱吃鱼的程序员 2020-05-31 13:05:09 0 浏览量 回答数 0

问题

iredis 一款python语言撰写支持自动补全、语法高亮、命令提示等的 Redis 命令行客户端

IRedis是具有自动完成功能和语法突出显示功能的redis终端客户端。 IRedis使您可以流畅地键入Redis命令,并以用户友好的格式显示结果。 IRedis是redis-cli的替代方案。在大多数情况下,I...
huc_逆天 2020-05-21 17:19:52 23 浏览量 回答数 1

回答

答案就是 'D:\\2006\\200601\\sh\\xxxx\\SH600590.csv' % name Python 2.7.6 (default, Sep 9 2014, 15:04:36) [GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.39)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> path_tmp = 'D:\\2006\\200601\\sh\\%s\\SH600590.csv' >>> >>> path_tmp 'D:\\2006\\200601\\sh\\%s\\SH600590.csv' >>> x = ['abc', 'abs', 'aaa', 'hello'] >>> x ['abc', 'abs', 'aaa', 'hello'] >>> for name in x: ... path = path_tmp % name ... print path ... D:\2006\200601\sh\abc\SH600590.csv D:\2006\200601\sh\abs\SH600590.csv D:\2006\200601\sh\aaa\SH600590.csv D:\2006\200601\sh\hello\SH600590.csv >>> ######嗯嗯~可是我在得到path的时候卡住了,这是我这部分的代码 for name in middle: path=path_tmp % name print(path) 提示错误: path=path_tmp % name ValueError: unsupported format character '\' (0x5c) at index 27请问是我空格问题出错了吗?麻烦你啦~######回复 @何以笙箫默wonder : 不会。print时才是\2006\200601,实际字符串内容仍然是\\2006\\200601######嗯嗯~但是还有一个问题,就是输出一串路径之后我还要读这些文件,也就是要引用这个路劲,但是这种方法最后导出的路径就是\2006\200601,但是‘\数字’这种形式在python里面好像代表字符串, 所以识别不出来,请问您知道这个问题如何解决吗?###### 路径存到列表中。迭代列表。 ######比如我要引入60个csv文件,它们路径相似,首先我想导入它们的文件路径‘D:\\2006\\200601\\sh\\xxxx\\SH600590.csv’,每个文件的路径只有xxxx部分是不同的,我把这60个应该有的xxxx已经存入到一个list里面,想通过循环,在xxxx处设置一个变量,按顺序读取list中的数据,从而读取路径,这个可以实现吗?还是路径中不能有这种变量存在?麻烦啦!######format
kun坤 2020-06-07 21:15:57 0 浏览量 回答数 0

回答

Python对文件的操作还算是方便的,只需要包含os模块进来,使用相关函数即可实现目录的创建。 主要涉及到三个函数 1、os.path.exists(path) 判断一个目录是否存在 2、os.makedirs(path) 多层创建目录 3、os.mkdir(path) 创建目录 DEMO 直接上代码 123456789101112131415161718192021222324252627282930def mkdir(path): # 引入模块 import os # 去除首位空格 path=path.strip() # 去除尾部 \ 符号 path=path.rstrip("\\") # 判断路径是否存在 # 存在 True # 不存在 False isExists=os.path.exists(path) # 判断结果 if not isExists: # 如果不存在则创建目录  # 创建目录操作函数 os.makedirs(path) print path+' 创建成功' return True else: # 如果目录存在则不创建,并提示目录已存在 print path+' 目录已存在' return False 定义要创建的目录 mkpath="d:\qttc\web\" 调用函数 mkdir(mkpath) 以上是我写好的一个函数,只需要传入你要创建目录的全路径即可。 说明 在以上DEMO的函数里,我并没有使用os.mkdir(path)函数,而是使用了多层创建目录函数os.makedirs(path)。这两个函数之间最大的区别是当父目录不存在的时候os.mkdir(path)不会创建,os.makedirs(path)则会创建父目录。 比如:例子中我要创建的目录web位于D盘的qttc目录下,然而我D盘下没有qttc父目录,如果使用os.mkdir(path)函数就会提示我目标路径不存在,但使用os.makedirs(path)会自动帮我创建父目录qttc,请在qttc目录下创建子目录web。
xuning715 2019-12-02 01:10:37 0 浏览量 回答数 0

回答

字符串类型:二进制安全的字符串Lists: 按插入顺序排序的字符串元素的集合。他们基本上就是链表(linked lists)。Sets: 不重复且无序的字符串元素的集合。Sorted sets,类似Sets,但是每个字符串元素都关联到一个叫score浮动数值(floating number value)。里面的元素总是通过score进行着排序,所以不同的是,它是可以检索的一系列元素。Hashes,由field和关联的value组成的map。field和value都是字符串的。这和Ruby、Python的hashes很像。Bit arrays (或者说 simply bitmaps): 通过特殊的命令,你可以将 String 值当作一系列 bits 处理:可以设置和清除单独的 bits,数出所有设为 1 的 bits 的数量,找到最前的被设为 1 或 0 的 bit,等等。HyperLogLogs: 这是被用于估计一个 set 中元素数量的概率性的数据结构。别害怕,它比看起来的样子要简单…参见本教程的 HyperLogLog 部分。GEO功能在Redis3.2版本提供,支持存储地理位置信息用来实现诸如附近位置、摇一摇这类依赖于地理位置信息的功能.geo的数据类型为zset.Stream是Redis 5.0版本引入的一个新的数据类型,它以更抽象的方式模拟日志数据结构,但日志仍然是完整的:就像一个日志文件,通常实现为以只附加模式打开的文件,Redis流主要是一个仅附加数据结构。 上文摘自:http://www.redis.cn/ 另外也可以参考https://help.aliyun.com/document_detail/26356.html ,阿里云redis提供了更加丰富的数据结构:TairGIS、TairBloom等
煮茶 2020-03-12 17:28:54 0 浏览量 回答数 0

问题

python Tkinter和urllib2 脚本问题:报错

周末时写的一个可以自动提交BUG的脚本,主要是从excel中读取信息,然后自动保存到服务器上。最初是纯脚本,测试过执行没问题,功能也实现了。后来经理要求改成界面的,昨天看...
kun坤 2020-06-07 21:36:39 0 浏览量 回答数 1

问题

xcode 4 中配置 Three20 开发环境 配置报错

" 大名鼎鼎的Three20想必大家都听说过,很多APP都是用它开发的,开发UI很方便,功能也很强大,用它就不必深究枯燥的iOS SDK。今天介绍一下如何在xcode4中配置环...
huc_逆天 2020-05-27 21:23:44 1 浏览量 回答数 0

问题

用JavaScript编写一个Java虚拟机?谈谈哗众取宠的BicaVM 400 请求报错 

http://www.cnbeta.com/articles/163172.htm 感谢鹏凌三千的投递 新闻来源:原创 今日目睹某网络新闻,开篇明义便包含如下几行文字【程序员Artur Ventura,这位超级大...
kun坤 2020-05-29 09:57:19 2 浏览量 回答数 1

问题

xcode 4 中配置 Three20 开发环境-xcode报错

大名鼎鼎的Three20想必大家都听说过,很多APP都是用它开发的,开发UI很方便,功能也很强大,用它就不必深究枯燥的iOS SDK。今天介绍一下如何在xcode4中配置环境支持Thr...
montos 2020-05-29 21:16:31 1 浏览量 回答数 1

问题

xcode 4 中配置 Three20 开发环境:报错

大名鼎鼎的Three20想必大家都听说过,很多APP都是用它开发的,开发UI很方便,功能也很强大,用它就不必深究枯燥的iOS SDK。今天介绍一下如何在xcode4中配置环境支持Thr...
kun坤 2020-06-05 23:11:51 0 浏览量 回答数 1

回答

Go 的优势在于能够将简单的和经过验证的想法结合起来,同时避免了其他语言中出现的许多问题。本文概述了 Go 背后的一些设计原则和工程智慧,作者认为,Go 语言具备的所有这些优点,将共同推动其成为接替 Java 并主导下一代大型软件开发平台的最有力的编程语言候选。很多优秀的编程语言只是在个别领域比较强大,如果将所有因素都纳入考虑,没有其他语言能够像 Go 语言一样“全面开花”,在大型软件工程方面,尤为如此。 基于现实经验 Go 是由经验丰富的软件行业老手一手创建的,长期以来,他们对现有语言的各种缺点有过切身体会的痛苦经历。几十年前,Rob Pike 和 Ken Thompson 在 Unix、C 和 Unicode 的发明中起到了重要作用。Robert Griensemer 在为 JavaScript 和 Java 开发 V8 和 HotSpot 虚拟机之后,在编译器和垃圾收集方面拥有数十年的经验。有太多次,他们不得不等待 Google 规模的 C++/Java 代码库进行编译。于是,他们开始着手创建新的编程语言,将他们半个世纪以来的编写代码所学到的一切经验包含进去。 专注于大型工程 小型工程项目几乎可以用任何编程语言来成功构建。当成千上万的开发人员在数十年的持续时间压力下,在包含数千万行代码的大型代码库上进行协作时,就会发生真正令人痛苦的问题。这样会导致一些问题,如下: 较长的编译时间导致中断开发。代码库由几个人 / 团队 / 部门 / 公司所拥有,混合了不同的编程风格。公司雇佣了数千名工程师、架构师、测试人员、运营专家、审计员、实习生等,他们需要了解代码库,但也具备广泛的编码经验。依赖于许多外部库或运行时,其中一些不再以原始形式存在。在代码库的生命周期中,每行代码平均被重写 10 次,被弄得千疮百痍,而且还会发生技术偏差。文档不完整。 Go 注重减轻这些大型工程的难题,有时会以使小型工程变得更麻烦为代价,例如,代码中到处都需要几行额外的代码行。 注重可维护性 Go 强调尽可能多地将工作转给自动化的代码维护工具中。Go 工具链提供了最常用的功能,如格式化代码和导入、查找符号的定义和用法、简单的重构以及代码异味的识别。由于标准化的代码格式和单一的惯用方式,机器生成的代码更改看起来非常接近 Go 中人为生成的更改并使用类似的模式,从而允许人机之间更加无缝地协作。 保持简单明了 初级程序员为简单的问题创建简单的解决方案。高级程序员为复杂的问题创建复杂的解决方案。伟大的程序员找到复杂问题的简单解决方案。 ——Charles Connell 让很多人惊讶的一点是,Go 居然不包含他们喜欢的其他语言的概念。Go 确实是一种非常小巧而简单的语言,只包含正交和经过验证的概念的最小选择。这鼓励开发人员用最少的认知开销来编写尽可能简单的代码,以便许多其他人可以理解并使用它。 使事情清晰明了 良好的代码总是显而易见的,避免了那些小聪明、难以理解的语言特性、诡异的控制流和兜圈子。 许多语言都致力提高编写代码的效率。然而,在其生命周期中,人们阅读代码的时间却远远超过最初编写代码所需的时间(100 倍)。例如,审查、理解、调试、更改、重构或重用代码。在查看代码时,往往只能看到并理解其中的一小部分,通常不会有完整的代码库概述。为了解释这一点,Go 将所有内容都明确出来。 错误处理就是一个例子。让异常在各个点中断代码并在调用链上冒泡会更容易。Go 需要手动处理和返回每个错误。这使得它可以准确地显示代码可以被中断的位置以及如何处理或包装错误。总的来说,这使得错误处理编写起来更加繁琐,但是也更容易理解。 简单易学 Go 是如此的小巧而简单,以至于人们可以在短短几天内就能研究通整个语言及其基本概念。根据我们的经验,培训用不了一个星期(相比于掌握其他语言需要几个月),初学者就能够理解 Go 专家编写的代码,并为之做出贡献。为了方便吸引更多的用户,Go 网站提供了所有必要的教程和深入研究的文章。这些教程在浏览器中运行,允许人们在将 Go 安装到本地计算机上之前就能够学习和使用 Go。 解决之道 Go 强调的是团队之间的合作,而不是个人的自我表达。 在 Go(和 Python)中,所有的语言特性都是相互正交和互补的,通常有一种方法可以做一些事情。如果你想让 10 个 Python 或 Go 程序员来解决同一个问题,你将会得到 10 个相对类似的解决方案。不同的程序员在彼此的代码库中感觉更自在。在查看其他人的代码时,国骂会更少,而且人们的工作可以更好地融合在一起,从而形成了一致的整体,人人都为之感到自豪,并乐于工作。这还避免了大型工程的问题,如: 开发人员认为良好的工作代码很“混乱”,并要求在开始工作之前进行重写,因为他们的思维方式与原作者不同。 不同的团队成员使用不同的语言子集来编写相同代码库的部分内容。 ![image.png](https://ucc.alicdn.com/pic/developer-ecology/e64418f1455d46aaacfdd03fa949f16d.png) 简单、内置的并发性 Go 专为现代多核硬件设计。 目前使用的大多数编程语言(Java、JavaScript、Python、Ruby、C、C++)都是 20 世纪 80 年代到 21 世纪初设计的,当时大多数 CPU 只有一个计算内核。这就是为什么它们本质上是单线程的,并将并行化视为边缘情况的马后炮。通过现成和同步点之类的附加组件来实现,而这些附加组件既麻烦又难以正确使用。第三方库虽然提供了更简单的并发形式,如 Actor 模型,但是总有多个可用选项,结果导致了语言生态系统的碎片化。今天的硬件拥有越来越多的计算内核,软件必须并行化才能高效运行。Go 是在多核处理器时代编写的,并且在语言中内置了简单、高级的 CSP 风格并发性。 面向计算的语言原语 就深层而言,计算机系统接收数据,对其进行处理(通常要经过几个步骤),然后输出结果数据。例如,Web 服务器从客户端接收 HTTP 请求,并将其转换为一系列数据库或后端调用。一旦这些调用返回,它就将接收到的数据转换成 HTML 或 JSON 并将其输出给调用者。Go 的内置语言原语直接支持这种范例: 结构表示数据 读和写代表流式 IO 函数过程数据 goroutines 提供(几乎无限的)并发性 在并行处理步骤之间传输管道数据 因为所有的计算原语都是由语言以直接形式提供的,因此 Go 源代码更直接地表达了服务器执行的操作。 OO — 好的部分 更改基类中的某些内容的副作用 面向对象非常有用。过去几十年来,面向对象的使用富有成效,并让我们了解了它的哪些部分比其他部分能够更好地扩展。Go 在面向对象方面采用了一种全新的方法,并记住了这些知识。它保留了好的部分,如封装、消息传递等。Go 还避免了继承,因为它现在被认为是有害的,并为组合提供了一流的支持。 现代标准库 目前使用的许多编程语言(Java、JavaScript、Python、Ruby)都是在互联网成为当今无处不在的计算平台之前设计的。因此,这些语言的标准库只提供了相对通用的网络支持,而这些网络并没有针对现代互联网进行优化。Go 是十年前创建的,当时互联网已全面发展。Go 的标准库允许在没有第三方库的情况下创建更复杂的网络服务。这就避免了第三方库的常见问题: 碎片化:总是有多个选项实现相同的功能。 膨胀:库常常实现的不仅仅是它们的用途。 依赖地狱:库通常依赖于特定版本的其他库。 未知质量:第三方代码的质量和安全性可能存在问题。 未知支持:第三方库的开发可能随时停止支持。 意外更改:第三方库通常不像标准库那样严格地进行版本控制。 关于这方面更多的信息请参考 Russ Cox 提供的资料 标准化格式 Gofmt 的风格没有人会去喜欢,但人人都会喜欢 gofmt。 ——Rob Pike Gofmt 是一种以标准化方式来格式化 Go 代码的程序。它不是最漂亮的格式化方式,但却是最简单、最不令人生厌的格式化方式。标准化的源代码格式具有惊人的积极影响: 集中讨论重要主题: 它消除了围绕制表符和空格、缩进深度、行长、空行、花括号的位置等一系列争论。 开发人员在彼此的代码库中感觉很自在, 因为其他代码看起来很像他们编写的代码。每个人都喜欢自由地按照自己喜欢的方式进行格式化代码,但如果其他人按照自己喜欢的方式格式化了代码,这么做很招人烦。 自动代码更改并不会打乱手写代码的格式,例如引入了意外的空白更改。 许多其他语言社区现在正在开发类似 gofmt 的东西。当作为第三方解决方案构建时,通常会有几个相互竞争的格式标准。例如,JavaScript 提供了 Prettier 和 StandardJS。这两者都可以用,也可以只使用其中的一个。但许多 JS 项目并没有采用它们,因为这是一个额外的决策。Go 的格式化程序内置于该语言的标准工具链中,因此只有一个标准,每个人都在使用它。 快速编译 ![image.png](https://ucc.alicdn.com/pic/developer-ecology/8a76f3f07f484266af42781d9e7b8692.png) 对于大型代码库来说,它们长时间的编译是促使 Go 诞生的原因。Google 主要使用的是 C++ 和 Java,与 Haskell、Scala 或 Rust 等更复杂的语言相比,它们的编译速度相对较快。尽管如此,当编译大型代码库时,即使是少量的缓慢也会加剧编译的延迟,从而激怒开发人员,并干扰流程。Go 的设计初衷是为了提高编译效率,因此它的编译器速度非常快,几乎没有编译延迟的现象。这给 Go 开发人员提供了与脚本类语言类似的即时反馈,还有静态类型检查的额外好处。 交叉编译 由于语言运行时非常简单,因此它被移植到许多平台,如 macOS、Linux、Windows、BSD、ARM 等。Go 可以开箱即用地为所有这些平台编译二进制文件。这使得从一台机器进行部署变得很容易。 快速执行 Go 的运行速度接近于 C。与 JITed 语言(Java、JavaScript、Python 等)不同,Go 二进制文件不需要启动或预热的时间,因为它们是作为编译和完全优化的本地代码的形式发布的。Go 的垃圾收集器仅引入微秒量级的可忽略的停顿。除了快速的单核性能外,Go 还可以轻松利用所有的 CPU 内核。 内存占用小 像 JVM、Python 或 Node 这样的运行时不仅仅在运行时加载程序代码,每次运行程序时,它们还会加载大型且高度复杂的基础架构,以进行编译和优化程序。如此一来,它们的启动时间就变慢了,并且还占用了大量内存(数百兆字节)。而 Go 进程的开销更小,因为它们已经完全编译和优化,只需运行即可。Go 还以非常节省内存的方式来存储数据。在内存有限且昂贵的云环境中,以及在开发过程中,这一点非常重要。我们希望在一台机器上能够快速启动整个堆栈,同时将内存留给其他软件。 部署规模小 Go 的二进制文件大小非常简洁。Go 应用程序的 Docker 镜像通常比用 Java 或 Node 编写的等效镜像要小 10 倍,这是因为它无需包含编译器、JIT,以及更少的运行时基础架构的原因。这些特点,在部署大型应用程序时很重要。想象一下,如果要将一个简单的应用程序部署到 100 个生产服务器上会怎么样?如果使用 Node/JVM 时,我们的 Docker 注册表就必须提供 100 个 docker 镜像,每个镜像 200MB,那么一共就需要 20GB。要完成这些部署就需要一些时间。想象一下,如果我们想每天部署 100 次的话,如果使用 Go 服务,那么 Docker 注册表只需提供 10 个 docker 镜像,每个镜像只有 20MB,共只需 2GB 即可。大型 Go 应用程序可以更快、更频繁地部署,从而使得重要更新能够更快地部署到生产环境中。 独立部署 Go 应用程序部署为一个包含所有依赖项的单个可执行文件,并无需安装特定版本的 JVM、Node 或 Python 运行时;也不必将库下载到生产服务器上,更无须对运行 Go 二进制文件的机器进行任何更改。甚至也不需要讲 Go 二进制文件包装到 Docker 来共享他们。你需要做的是,只是将 Go 二进制文件放到服务器上,它就会在那里运行,而不用关心服务器运行的是什么。前面所提到的那些,唯一的例外是使用net和os/user包时针对对glibc的动态链接。 供应依赖关系 Go 有意识避免使用第三方库的中央存储库。Go 应用程序直接链接到相应的 Git 存储库,并将所有相关代码下载(供应)到自己的代码库中。这样做有很多好处: 在使用第三方代码之前,我们可以对其进行审查、分析和测试。该代码就和我们自己的代码一样,是我们应用程序的一部分,应该遵循相同的质量、安全性和可靠性标准。 无需永久访问存储依赖项的各个位置。从任何地方(包括私有 Git repos)获取第三方库,你就能永久拥有它们。 经过验收后,编译代码库无需进一步下载依赖项。 若互联网某处的代码存储库突然提供不同的代码,这也并不足为奇。 即使软件包存储库速度变慢,或托管包不复存在,部署也不会因此中断。 兼容性保证 Go 团队承诺现有的程序将会继续适用于新一代语言。这使得将大型项目升级到最新版本的编译器会非常容易,并且可从它们带来的许多性能和安全性改进中获益。同时,由于 Go 二进制文件包含了它们需要的所有依赖项,因此可以在同一服务器上并行运行使用不同版本的 Go 编译器编译的二进制文件,而无需进行复杂的多个版本的运行时设置或虚拟化。 文档 在大型工程中,文档对于使软件可访问性和可维护性非常重要。与其他特性类似,Go 中的文档简单实用: 由于它是嵌入到源代码中的,因此两者可以同时维护。 它不需要特殊的语法,文档只是普通的源代码注释。 可运行单元测试通常是最好的文档形式。因此 Go 要求将它们嵌入到文档中。 所有的文档实用程序都内置在工具链中,因此每个人都使用它们。 Go linter 需要导出元素的文档,以防止“文档债务”的积累。 商业支持的开源 当商业实体在开放式环境下开发时,那么一些最流行的、经过彻底设计的软件就会出现。这种设置结合了商业软件开发的优势——一致性和精细化,使系统更为健壮、可靠、高效,并具有开放式开发的优势,如来自许多行业的广泛支持,多个大型实体和许多用户的支持,以及即使商业支持停止的长期支持。Go 就是这样发展起来的。 缺点 当然,Go 也并非完美无缺,每种技术选择都是有利有弊。在决定选择 Go 之前,有几个方面需要进行考虑考虑。 未成熟 虽然 Go 的标准库在支持许多新概念(如 HTTP 2 Server push 等)方面处于行业领先地位,但与 JVM 生态系统中的第三方库相比,用于外部 API 的第三方 Go 库可能不那么成熟。 即将到来的改进 由于清楚几乎不可能改变现有的语言元素,Go 团队非常谨慎,只在新特性完全开发出来后才添加新特性。在经历了 10 年的有意稳定阶段之后,Go 团队正在谋划对语言进行一系列更大的改进,作为 Go 2.0 之旅的一部分。 无硬实时 虽然 Go 的垃圾收集器只引入了非常短暂的停顿,但支持硬实时需要没有垃圾收集的技术,例如 Rust。 结语 本文详细介绍了 Go 语言的一些优秀的设计准则,虽然有的准则的好处平常看起来没有那么明显。但当代码库和团队规模增长几个数量级时,这些准则可能会使大型工程项目免于许多痛苦。总的来说,正是这些设计准则让 Go 语言成为了除 Java 之外的编程语言里,用于大型软件开发项目的绝佳选择。
有只黑白猫 2020-01-07 14:11:38 0 浏览量 回答数 0

回答

我觉得要理解django的class-based-view(以下简称cbv),首先要明白django引入cbv的目的是什么。在django1.3之前,generic view也就是所谓的通用视图,使用的是function-based-view(fbv),亦即基于函数的视图。有人认为fbv比cbv更pythonic,窃以为不然。python的一大重要的特性就是面向对象。而cbv更能体现python的面向对象。cbv是通过class的方式来实现视图方法的。class相对于function,更能利用多态的特定,因此更容易从宏观层面上将项目内的比较通用的功能抽象出来。关于多态,不多解释,有兴趣的同学自己Google。总之可以理解为一个东西具有多种形态(的特性)。cbv的实现原理通过看django的源码就很容易明白,大体就是由url路由到这个cbv之后,通过cbv内部的dispatch方法进行分发,将get请求分发给cbv.get方法处理,将post请求分发给cbv.post方法处理,其他方法类似。怎么利用多态呢?cbv里引入了mixin的概念。Mixin就是写好了的一些基础类,然后通过不同的Mixin组合成为最终想要的类。 所以,理解cbv的基础是,理解Mixin。 我们以1.5为例简单讲解一下Mixin。 在python-path/Lib/site-packages/django/view/generic文件夹下,包含了django自带的几个基于类的通用视图。 base.py: ContextMixin: 提供get_context_data方法,给cbv提供context_data View: cbv的基类,提供视图分发等功能 TemplateResponseMixin: 提供渲染模板等功能 TemplateView(TemplateResponseMixin, ContextMixin, View): 从类的构造上就可以看出,这个类是由TemplateResponseMixin,ContextMixin,View三个类共同继承而来的,所以同时具有这三个类的特定,因此,这个类完整的提供了一个cbv应该具有的所有动作(除了处理数据)。 RedirectView(View): 这是View的一个子类,实现的是重定向的功能。 base中已经提供了构成cbv最最基础的几个Mixin,以及cbv的基类View。 以下django又提供了detail,list,edit,dates四个模块,这四个模块分别用来处理detail数据(比如显示日志的某一篇的明细信息),list(比如显示某user的所有日志列表),edit(比如为用户提供新增日志和修改日志的功能),dates(比如显示2014年10月的日志)。想一下,从数据维度上讲,默认的django cbv提供了按照数据维度处理的两个不同的cbv,分别是detail和list。detail显示一个数据对象,list显示数据列表。 下面先分析detail.py: SimpleObjectMixin(ContextMixin): 这是ContextMixin的一个子类,提供最基础的取回单个对象的功能。 BaseDetailView(SimpleObjectMixin, View): 提供显示单个对象的功能。 SimpleObjectTemplateResponseMixin(TemplateResponseMixin): 这是对TemplateResponseMixin的再次封装,为了实现单个对象的模板显示。 DetailView(SimpleObjectTemplateResponseMixin, BaseDetailView): 这就是完整的detail view了。 从以上类的继承上就可以大致猜出,detail模块中的相关cbv其实是对base中提供的mixin的再度继承。从而实现更精细复杂的功能。 所以剩下几个模块题主完全可以自己分析了。 所以分析完了各个模块提供的功能就完了吗?如果到这里止步,那么还是不了解cbv的好处。上文说过,cbv的一大好处就是多态。因此可以把通用的功能抽象出来做成mixin给其他cbv用。 比如,想实现restful API。最简单的,想实现返回json数据。写一个mixin就好了。 class JSONResponseMixin(object): """JSON mixin""" def render_to_response(self, context): return self.get_json_response(self.convert_context_to_json(context)) def get_json_response(self, content, **httpresponse_kwargs): return HttpResponse(content, content_type='application/json', **httpresponse_kwargs) def convert_context_to_json(self, context): return json.dumps(context) 怎么用呢? class CheckRemindUtilView(JSONResponseMixin, ListView): """ Check if there is reminder need to be reminded. This view should be called every minute. """ def get_queryset(self): start = timezone.now() end = start + datetime.timedelta(minutes=1) return Reminder.objects.filter(next_t__gte=start, next_t__lte=end, is_valid=True) def get(self, request, *args, **kwargs): self.object_list = self.get_queryset() if (self.get_paginate_by(self.object_list) is not None and hasattr(self.object_list, 'exists')): is_empty = not self.object_list.exists() else: is_empty = len(self.object_list) == 0 if is_empty: ret = {'code': 42, 'msg': 'empty'} else: for object_ in self.object_list: code = exec_remind(object_) object_.previous_t = object_.next_t update_reminder(object_) ret = {'code': code, 'msg': 'reminded.'} return self.render_to_response(ret) 再从另一个方向举个栗子。比如需要对日志进行用户过滤,用户私有的日志只能用户自己看到,其他人看不到。那么只需要写一个PrivateObjectMixin,然后其他DetailView,ListView继承这个就好了。 class PrivateObjectMixin(object): ''' Filter private object for request.user ''' def filte_private(self, queryset): ''' Filte private object for authenticated user. ''' ordering = getattr(self, 'ordering', '-date_created') if not hasattr(self, 'request'): return queryset if not hasattr(self.request, 'user'): return queryset if self.request.user.is_authenticated(): queryset = queryset.filter(Q(is_valid=True), Q(is_private=True) & Q(user__id=self.request.user.id) | Q(is_private=False)) else: queryset = queryset.filter(is_valid=True, is_private=False) try: result = queryset.order_by(ordering) except FieldError: # The model doesnot have an `ordering` field. return queryset return result class NoteListView(PrivateObjectMixin, BaseNoteListView): ''' Show note list. ''' def get_queryset(self): ''' Get notes. ''' queryset = Note.objects.all() return self.filte_private(queryset) 上面这两个例子只是简单的应用而已,完全可以借助多态实现更复杂的cbv。 以下是建议部分: 1,建议翻阅django cbv的源码,自己画个图了解cbv的实现原理,继承流程。 2,自己写几个简单的cbv。 “答案来源于网络,供您参考”
牧明 2019-12-02 02:15:02 0 浏览量 回答数 0
阿里云企业服务平台 陈四清的老板信息查询 上海奇点人才服务相关的云产品 爱迪商标注册信息 安徽华轩堂药业的公司信息查询 小程序定制 上海微企信息技术相关的云产品 国内短信套餐包 ECS云服务器安全配置相关的云产品 天籁阁商标注册信息 开发者问答 阿里云建站 自然场景识别相关的云产品 万网 小程序开发制作 视频内容分析 视频集锦 代理记账服务 北京芙蓉天下的公司信息查询