是否有一种编程方式来获取函数可能引发的所有异常的列表?
我知道例如os.makedirs(path[, mode])可以提出PermissionError(也许是其他人),但文档只提到OSError.(这只是一个例子 - 可能甚至是一个坏的;我对这个功能并不特别感兴趣 - 一般来说问题更多).
有没有一种编程方法可以在没有/文档记录不足时找到所有可能的异常?这可能在第三方库和未附带Python源代码的库中特别有用.
" Python:如何知道可能从方法调用中抛出哪些异常 "中提供的解决方案在Python 3中不起作用; 没有compiler包裹.
python最近添加了pathlib模块(我非常喜欢!).
只有一件事我正在努力:是否可以规范化不存在的文件或目录的路径?我能完美地做到这一点os.path.normpath.但是,除了应该处理路径相关内容的库以外,还有什么不是荒谬的吗?
我想要的功能是:
from os.path import normpath
from pathlib import Path
pth = Path('/tmp/some_directory/../i_do_not_exist.txt')
pth = Path(normpath(str(pth)))
# -> /tmp/i_do_not_exist.txt
Run Code Online (Sandbox Code Playgroud)
但无需诉诸os.path和不必输入str和返回Path.也pth.resolve()不会为不存在的文件.
有一个简单的方法pathlib吗?
我需要迭代一个索引元组.所有指数必须在[0, N)条件范围内
i > j.我在这里介绍的玩具示例只涉及两个指数; 我需要将其扩展到三个(有i > j > k)或更多.
基本版本是这样的:
N = 5
for i in range(N):
for j in range(i):
print(i, j)
Run Code Online (Sandbox Code Playgroud)
它工作得很好; 输出是
1 0
2 0
2 1
3 0
3 1
3 2
4 0
4 1
4 2
4 3
Run Code Online (Sandbox Code Playgroud)
我不希望每个附加索引都有一个缩进级别,因此我更喜欢这个版本:
for i, j in ((i, j) for i in range(N) for j in range(i)):
print(i, j)
Run Code Online (Sandbox Code Playgroud)
这非常有效,它应该做什么,并摆脱额外的缩进水平.
我希望能够有更优雅的东西(两个指数并非完全相关,但三个或更多指数变得更相关).到目前为止我想出的是:
from itertools import combinations
for j, i in combinations(range(N), 2): …Run Code Online (Sandbox Code Playgroud) 铁锈中的惯用语for/else:
在 Python 中,我可以使用for/else检查循环是否for在语句处终止break或“正常”完成:
prod = 1
for i in range(1, 10):
prod *= i
if prod > 123:
break
else:
print("oops! loop terminated without break.")
Run Code Online (Sandbox Code Playgroud)
Rust 有类似的方法吗?这是我最接近的,但并不是特别相似。
let mut prod = 1u64;
let mut found = false;
for i in 1..10 {
prod *= i;
if prod > 123 {
found = true;
break;
}
}
if !found {
println!("oops! loop terminated without break.");
}
Run Code Online (Sandbox Code Playgroud)
似乎有关于Rust Internals的讨论;然而,这更多的是关于未来的可能性,而不是惯用的。 …
我正在尝试反编译我的react/es6代码,我来自browserify.我正在努力创建一个webpack构建,因为新的babel 6版本以及大多数教程现在已经过时的事实.这适用于我的.babelrc:
{
"presets": ["react"]
}
Run Code Online (Sandbox Code Playgroud)
但是当我改变它时:
{
"presets": ["es2015", "react"]
}
Run Code Online (Sandbox Code Playgroud)
它引发了这个神秘的错误:
ERROR in ./client/App.js
Module build failed: Error: You gave us a visitor for the node type "NumericLiteral" but it's not a valid type
这是我的webpack.config.js,如果这有帮助的话:
module.exports = {
entry: "./client/App.js",
output: {
filename: "public/bundle.js"
},
resolve: {
extensions: ['', '.js', '.jsx']
},
module: {
loaders: [
{
test: /\.jsx?$/,
exclude: /(node_modules|bower_components)/,
loader: 'babel'
}
]
}
};
Run Code Online (Sandbox Code Playgroud)
有什么明显的东西我不见了吗?我也交换了预设的顺序,它似乎没有什么区别.我的节点模块中有babel-core,babel-loader,babel-preset-es2015,babel-preset-react和webpack.
python 3.5是否提供了允许测试给定参数是否适合函数声明中给出的类型提示的函数?
如果我有这样的功能:
def f(name: List[str]):
pass
Run Code Online (Sandbox Code Playgroud)
有没有python方法可以检查是否
name = ['a', 'b']
name = [0, 1]
name = []
name = None
...
Run Code Online (Sandbox Code Playgroud)
适合类型提示?
我知道'在运行时没有进行类型检查'但是我仍然可以在python中手动检查这些参数的有效性吗?
或者如果python本身不提供该功能:我需要使用什么工具?
我可以这样沉默和恢复sys.stdout:
import sys
sys.stdout = None
print('hello') # does not write to stdout
sys.stdout = sys.__stdout__
print('hello') # writes to stdout
Run Code Online (Sandbox Code Playgroud)
我知道我最好使用contextlib.redirect_stdout它可能做类似的事情,但我的问题是:为什么上面的代码工作?
我已经假设python会调用类似的东西sys.stdout.write(),无论我替换sys.stdout它应该至少有一个write方法(例如io.StringIO).
我需要读写大量的二进制文件.BLOCK_SIZE我应该read()一次有一个首选的甚至是最佳的字节数(我称之为)吗?
一个字节肯定太少了,我不认为在RAM中读取4 GB也不是一个好主意 - 是否有'最佳'块大小?或者这甚至取决于文件系统(我在ext4上)?我需要考虑什么?
Pythonopen()甚至提供了一个buffering参数.我还需要调整一下吗?
这是仅加入两个文件in-0.data并in-1.data进入的示例代码out.data(在现实生活中,有更多处理与手头的问题无关).该BLOCK_SIZE选择等于io.DEFAULT_BUFFER_SIZE这似乎是默认为buffering:
from pathlib import Path
from functools import partial
DATA_PATH = Path(__file__).parent / '../data/'
out_path = DATA_PATH / 'out.data'
in_paths = (DATA_PATH / 'in-0.data', DATA_PATH / 'in-1.data')
BLOCK_SIZE = 8192
def process(data):
pass
with out_path.open('wb') as out_file:
for in_path in in_paths:
with in_path.open('rb') as in_file:
for data in iter(partial(in_file.read, BLOCK_SIZE), b''):
process(data) …Run Code Online (Sandbox Code Playgroud) 关于这个问题的后续问题:我在python 3.5和python 3.6上运行了下面的代码 - 结果非常不同:
class Container:
KEYS = ('a', 'b', 'c')
def __init__(self, a=None, b=None, c=None):
self.a = a
self.b = b
self.c = c
def keys(self):
return Container.KEYS
def __getitem__(self, key):
if key not in Container.KEYS:
raise KeyError(key)
return getattr(self, key)
def __str__(self):
# python 3.6
# return f'{self.__class__.__name__}(a={self.a}, b={self.b}, c={self.c})'
# python 3.5
return ('{self.__class__.__name__}(a={self.a}, b={self.b}, '
'c={self.c})').format(self=self)
data0 = Container(a=1, b=2, c=3)
print(data0)
data3 = Container(**data0, b=7)
print(data3)
Run Code Online (Sandbox Code Playgroud)
正如上一个问题所述,这引起了人们的注意
TypeError:type object为关键字参数'b'获取了多个值
在python …
The documentation for python's gc package says this about gc.get_count():
gc.get_count()
Return the current collection counts as a tuple of (count0, count1, count2).
Run Code Online (Sandbox Code Playgroud)
Here is a sample program:
import gc
if __name__=="__main__":
print("making some data")
for k in range(10):
root = [range(i,1000) for i in range(1,1000)]
print("len(gc.get_objects):",len(gc.get_objects()))
print("gc.get_stats:",gc.get_stats())
print("gc.get_count:",gc.get_count())
Run Code Online (Sandbox Code Playgroud)
Here is the output:
making some data
len(gc.get_objects): 7130
gc.get_stats: [{'collections': 16, 'collected': 99, 'uncollectable': 0}, {'collections': 1, 'collected': 0, 'uncollectable': 0}, {'collections': 0, 'collected': 0, 'uncollectable': 0}]
gc.get_count: (75, 5, …Run Code Online (Sandbox Code Playgroud) python ×8
python-3.x ×4
python-3.4 ×3
python-3.5 ×2
babeljs ×1
control-flow ×1
file ×1
for-loop ×1
javascript ×1
python-3.6 ×1
reactjs ×1
rust ×1
stdout ×1
webpack ×1