小编hir*_*ist的帖子

如何列出函数可以在Python 3中引发的所有异常?

是否有一种编程方式来获取函数可能引发的所有异常的列表?

我知道例如os.makedirs(path[, mode])可以提出PermissionError(也许是其他人),但文档只提到OSError.(这只是一个例子 - 可能甚至是一个坏的;我对这个功能并不特别感兴趣 - 一般来说问题更多).

有没有一种编程方法可以在没有/文档记录不足时找到所有可能的异常?这可能在第三方库和未附带Python源代码的库中特别有用.

" Python:如何知道可能从方法调用中抛出哪些异常 "中提供的解决方案在Python 3中不起作用; 没有compiler包裹.

python python-3.4

20
推荐指数
1
解决办法
3139
查看次数

仅使用pathlib规范化不存在的路径

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吗?

python python-3.x python-3.4

18
推荐指数
2
解决办法
2892
查看次数

以pythonic方式迭代i> j(> k)的多个索引

我需要迭代一个索引元组.所有指数必须在[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)

python python-itertools python-3.x

14
推荐指数
3
解决办法
3052
查看次数

Rust 有没有办法区分正常循环终止和中断终止?

铁锈中的惯用语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的讨论;然而,这更多的是关于未来的可能性,而不是惯用的。 …

for-loop control-flow rust

11
推荐指数
1
解决办法
704
查看次数

使用带有babel和babel-preset-react和babel-preset-es2015的webpack

我正在尝试反编译我的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.

javascript reactjs webpack babeljs

10
推荐指数
1
解决办法
7178
查看次数

python 3.5类型提示:我可以检查函数参数是否匹配类型提示?

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本身不提供该功能:我需要使用什么工具?

python python-internals python-3.5

8
推荐指数
2
解决办法
1228
查看次数

为什么sys.stdout =无效?

我可以这样沉默和恢复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).

python stdout python-3.x python-internals

8
推荐指数
1
解决办法
196
查看次数

读/写大二进制文件时的首选块大小

我需要读写大量的二进制文件.BLOCK_SIZE我应该read()一次有一个首选的甚至是最佳的字节数(我称之为)吗?

一个字节肯定太少了,我不认为在RAM中读取4 GB也不是一个好主意 - 是否有'最佳'块大小?或者这甚至取决于文件系统(我在ext4上)?我需要考虑什么?

Pythonopen()甚至提供了一个buffering参数.我还需要调整一下吗?

这是仅加入两个文件in-0.datain-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 file python-3.4

7
推荐指数
1
解决办法
4390
查看次数

使用__getitem__ python 3.5 vs python 3.6解压缩不同行为的就地自定义对象

关于这个问题的后续问题:我在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 …

python python-3.x python-internals python-3.5 python-3.6

7
推荐指数
1
解决办法
174
查看次数

what are count0, count1 and count2 values returned by the Python gc.get_count()

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 garbage-collection python-internals

6
推荐指数
1
解决办法
678
查看次数