而已.如果要记录函数或类,请在定义之后放置一个字符串.例如:
def foo():
"""This function does nothing."""
pass
Run Code Online (Sandbox Code Playgroud)
但是模块怎么样?如何记录file.py的作用?
假设我有两个模块:
a.py:
import b
print __name__, __file__
Run Code Online (Sandbox Code Playgroud)
b.py:
print __name__, __file__
Run Code Online (Sandbox Code Playgroud)
我运行"a.py"文件.这打印:
b C:\path\to\code\b.py
__main__ C:\path\to\code\a.py
Run Code Online (Sandbox Code Playgroud)
问题:如何__main__从"b.py"库中获取模块的路径(在本例中为"a.py")?
我尝试了"heapq"并得出结论,我的期望与我在屏幕上看到的不同.我需要有人解释它是如何工作的以及它在哪里有用.
从第2.2 节中的本周Python模块一书中可以看出
如果在添加和删除值时需要维护排序列表,请查看heapq.通过使用heapq中的函数来添加或删除列表中的项,您可以以较低的开销维护列表的排序顺序.
这就是我所做的和得到的.
import heapq
heap = []
for i in range(10):
heap.append(i)
heap
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
heapq.heapify(heap)
heapq.heappush(heap, 10)
heap
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
heapq.heappop(heap)
0
heap
[1, 3, 2, 7, 4, 5, 6, 10, 8, 9] <<< Why the list does not remain sorted?
heapq.heappushpop(heap, 11)
1
heap
[2, 3, 5, 7, 4, 11, 6, 10, 8, 9] …Run Code Online (Sandbox Code Playgroud) 我担心这是解决问题的一种混乱方式,但......
假设我想根据某些条件在Python中进行一些导入.
出于这个原因,我想写一个函数:
def conditional_import_modules(test):
if test == 'foo':
import onemodule, anothermodule
elif test == 'bar':
import thirdmodule, and_another_module
else:
import all_the_other_modules
Run Code Online (Sandbox Code Playgroud)
现在我如何才能在全球范围内提供导入的模块?
例如:
conditional_import_modules(test='bar')
thirdmodule.myfunction()
Run Code Online (Sandbox Code Playgroud) 从正则表达式的python文档,关于'\'字符:
解决方案是使用Python的原始字符串表示法来表示正则表达式模式; 在前缀的字符串文字中,不以任何特殊方式处理反斜杠
'r'.所以r"\n"是一个包含'\'和的双字符字符串'n',"\n"而是包含换行符的单字符字符串.通常,模式将使用此原始字符串表示法在Python代码中表示.
什么是原始字符串表示法?如果您使用原始字符串格式,这是否意味着"*"作为文字字符而不是零或多指标?这显然是不对的,否则正则表达式将彻底失去它的力量.但是,如果它是一个原始字符串,它"\n"是如何识别换行符,如果它实际上是一个反斜杠和一个"n"?
我不跟随.
编辑赏金:
我试图理解原始字符串正则表达式如何匹配换行符,制表符和字符集,例如\w单词或\d数字或所有其他,如果原始字符串模式不能将反斜杠识别为普通字符以外的任何内容.我真的可以使用一些很好的例子.
我有一个Bottle webserver模块,其中包含以下行:
from foobar.formtools import auto_process_form_insert
Run Code Online (Sandbox Code Playgroud)
该foobar.formtools模块包含以下行:
from foobar.webserver import redirect, redirect_back
Run Code Online (Sandbox Code Playgroud)
当然,两者都会导致以下错误:
ImportError:无法导入名称auto_process_form_insert
ImportError:无法导入名称重定向
事实上,在Python中,两个模块不能互相导入,并且所有模块导入必须是分层的,或者我做错了什么?或者,是否有一种解决方法是将所有这些不错的功能放在新模块中?
无处不在,我看到Python代码使用import sys或导入模块import mymodule
如果没有提供目录或路径,解释器如何找到正确的文件?
我有一个模块foo,包含util.py和bar.py.
我想在IDLE或python会话中导入它.我该怎么做?
我找不到关于如何导入不在当前目录或默认python PATH中的模块的文档.尝试后import "<full path>/foo/util.py",和from "<full path>" import util
我能得到的最接近的是
import imp
imp.load_source('foo.util','C:/.../dir/dir2/foo')
Run Code Online (Sandbox Code Playgroud)
这给了我在Windows 7上的权限被拒绝.
在使用IPython在Python中开发一个大型项目(分成几个文件和文件夹)时,我遇到了缓存导入模块的麻烦.
问题是指令import module只读取模块一次,即使该模块已经改变!因此,每次我更改包中的内容时,都必须退出并重新启动IPython.痛苦.
有没有办法正确强制重装一些模块?或者,更好的是,以某种方式阻止Python缓存它们?
我尝试了几种方法,但都没有效果.特别是我遇到了非常非常奇怪的错误,就像一些模块或变量神秘地变得相等None......
我找到的唯一明智的资源是从pyunit 重新加载Python模块,但我没有检查它.我想要那样的东西.
一个很好的替代方案是让IPython重启,或以某种方式重启Python解释器.
那么,如果你用Python开发,你找到了什么解决方案来解决这个问题?
编辑
为了清楚起见:很明显,我理解一些旧的变量取决于模块的先前状态可能会存在.那个我能接受.为什么在Python中如此难以强制重新加载模块而不会发生各种奇怪的错误?
更具体地说,如果我将整个模块放在一个文件中,module.py那么以下工作正常:
import sys
try:
del sys.modules['module']
except AttributeError:
pass
import module
obj = module.my_class()
Run Code Online (Sandbox Code Playgroud)
这段代码很漂亮,我可以在不退出IPython的情况下开发数月.
但是,每当我的模块由多个子模块组成时,地狱就会松动:
import os
for mod in ['module.submod1', 'module.submod2']:
try:
del sys.module[mod]
except AttributeError:
pass
# sometimes this works, sometimes not. WHY?
Run Code Online (Sandbox Code Playgroud)
为什么我的模块在一个大文件或几个子模块中是如此不同?为什么这种方法不起作用?
我在这个有用的问答中看到了人们可以使用的,reload(whatever_module)或者在Python 3中imp.reload(whatever_module).
我的问题是,如果我说from whatever_module import *要导入怎么办?然后我whatever_module在使用时无需参考reload().你们是否会因为将整个模块投入全局命名空间而对我大喊大叫?:)
python ×10
python-module ×10
import ×3
external ×1
heap ×1
ipython ×1
module ×1
pythonpath ×1
rawstring ×1
regex ×1