通常,__new__如果类的用户知道有时构造函数将评估为None,那么从方法返回None是否合理?
文档并不意味着它是非法的,我没有看到任何直接的问题(因为__init__不会被调用,没有不是有问题的自定义类的实例!).但我很担心
具体例子:
class MyNumber(int):
def __new__(cls, value): # value is a string (usually) parsed from a file
if value == 'N.A.':
return None
return int.__new__(cls, value)
Run Code Online (Sandbox Code Playgroud) 在我用Python解释器中断执行后(在Windows中使用CTRL-BREAK),我可以继续执行吗?
如果没有,有没有其他方式交互式暂停执行(所以我可以查看变量值),然后继续?
我不喜欢使用调试器,因为它比正常执行慢得多.
我需要一个样本,无需替换,来自所有可能的数字元组range(n).也就是说,我有一个(0,0),(0,1),...,(0,n),(1,0),(1,1),...,(1,n)的集合),...,(n,0),(n,1),(n,n),我试图得到这些元素的k个样本.我希望避免明确构建此集合.
我知道random.sample(range(n), k)如果我需要一系列数字而不是数字元组的样本,那么它是简单而有效的.
当然,我可以显式构建包含所有可能(n * n = n^2)元组的列表,然后调用random.sample.但如果k比小得多,那可能效率不高n^2.
我不确定Python 2和3中的效率是否与效率相同; 我使用Python 3.
我需要确保程序中的所有随机性都是完全可复制的.我应该在哪里拨打random.seed()?
我认为它应该在我的main.py模块中,但它会导入其他碰巧使用随机函数的模块.
我可以仔细浏览我的导入,看看哪一个是第一个执行,但是当我改变我的代码结构时,我将不得不记得再次重做这个分析.
有没有简单安全的解决方案?
[使用Python 3.2]
如果我不提供encoding参数open,则使用打开文件locale.getpreferredencoding().因此,例如,在我的Windows机器上,无论何时使用open('abc.txt'),它都将使用解码cp1252.
我想将所有输入文件切换到utf-8.显然,我可以添加encoding = 'utf-8'到我的所有open函数调用.或者,更好的是,encoding = MY_PROJECT_DEFAULT_ENCODING常量在某个地方的全局级别定义.
但我想知道是否有一种干净的方法来避免编辑我的所有open调用,通过更改"默认"编码.是否可以通过更改区域设置来更改?或者通过更改语言环境中的参数?我试图遵循Python手册,但未能理解如何使用它.
谢谢!
我在平面文件中输入数据.我想通过将它们分成表来规范化这些数据.我可以巧妙地做到这一点pandas- 也就是说,通过将扁平数据读入DataFrame实例,然后应用一些函数来获得结果DataFrame实例?
例:
数据以CSV文件的形式提供给我,如下所示:
ItemId ClientId PriceQuoted ItemDescription
1 1 10 scroll of Sneak
1 2 12 scroll of Sneak
1 3 13 scroll of Sneak
2 2 2500 scroll of Invisible
2 4 2200 scroll of Invisible
Run Code Online (Sandbox Code Playgroud)
我想创建两个DataFrame:
ItemId ItemDescription
1 scroll of Sneak
2 scroll of Invisibile
Run Code Online (Sandbox Code Playgroud)
和
ItemId ClientId PriceQuoted
1 1 10
1 2 12
1 3 13
2 2 2500
2 4 2200
Run Code Online (Sandbox Code Playgroud)
如果pandas对于最简单的情况只有一个很好的解决方案(规范化导致2个表具有多对一关系 - 就像上面的例子一样),它可能足以满足我当前的需求.但是,我将来可能需要一个更通用的解决方案.
我有许多对象需要打印到终端(用于调试).普通print函数几乎是完美的,除了一些对象太大,因此print会产生数百万行输出.我想创建一个执行功能的函数print,除了在预定义数量的字符之后截断输出,用其替换其余字符....
有什么好办法呢?
请注意,性能是一个问题,所以理想情况下我不想保存一个千兆字节大小的字符串,然后从中获取前几个字符; 类似地,pprint有点问题,因为它在字典中对键进行排序(并且需要数百万个键才需要一段时间).
例:
obj = [ [1, 2, 3], list(range(1000000)) ]
my_print(obj, 20)
# should output:
# [[1, 2, 3], [0, 1, 2...
Run Code Online (Sandbox Code Playgroud)
Python 3,如果重要的话.
如果我正确理解了教程,Celery子任务支持与task几乎相同的 API ,但还有一个额外的优势,它可以传递给其他函数或进程。
显然,如果是这种情况,Celery 将简单地用子任务替换任务而不是保留两者(例如,装饰器会将函数转换为子任务而不是任务等)。所以我一定是误会了什么。@app.task
有什么可以一个任务做,一个子任务不能?
Celery API 发生了相当大的变化;我的问题特定于 3.1 版(目前是最新的)。
编辑:
我知道文档说子任务旨在从其他任务中调用。我的问题是什么阻止 Celery 完全摆脱任务并在任何地方使用子任务?它们似乎比任务更灵活/更强大:
# tasks.py
from celery import Celery
app = Celery(backend='rpc://')
@app.task
def add(x, y):
# just print out a log line for testing purposes
print(x, y)
# client.py
from tasks import add
add_subtask = add.subtask()
# in this context, it seems the following two lines …Run Code Online (Sandbox Code Playgroud) 是否obj == iter(obj)意味着obj不能重复迭代,反之亦然?我没有在文档中看到任何这样的措辞,但根据这个评论,标准库通过测试检查对象是否可重复迭代 :if iter(obj) is obj
@agf:Python标准库的某些部分依赖于规范的这一部分; 它们通过测试检测某些东西是否是迭代器/生成器
if iter(obj) is obj:,因为真正的迭代器/生成器对象将__iter__定义为标识函数.如果测试为真,则转换为list允许重复迭代,否则,假设对象可重复迭代,并且可以按原样使用它.
- ShadowRanger 6月3日17:23
文档确实声明如果obj是迭代器,则需要iter(obj)返回obj.但我认为这并不足以得出结论,可以使用非重复可迭代对象来识别iter(obj) is obj.
没有拆卸代码的(默认)功能范围夹具有什么优势?为什么不在测试开始时调用函数?
例如,写作的好处是什么:
@pytest.fixture
def smtp():
return smtplib.SMTP("smtp.gmail.com")
def test_ehlo(smtp):
response, msg = smtp.ehlo()
# ...
Run Code Online (Sandbox Code Playgroud)
而不是简单地:
def create_smtp():
return smtplib.SMTP("smtp.gmail.com")
def test_ehlo():
smtp = create_smtp()
response, msg = smtp.ehlo()
# ...
Run Code Online (Sandbox Code Playgroud)
我理解为什么在我们需要拆卸代码时固定装置很有用.我也理解为什么具有除函数之外的范围的灯具是有用的:我们可能希望在多个测试中重复使用相同的"外部"对象(以节省创建它所需的时间;或者甚至可能保持其状态 - 尽管看起来似乎相当危险,因为这会在单独的测试之间产生难以看见的耦合).
python ×10
python-3.x ×5
random ×2
algorithm ×1
celery ×1
coding-style ×1
debugging ×1
interpreter ×1
iterator ×1
locale ×1
new-operator ×1
pandas ×1
pytest ×1
windows ×1