下面是我编写的程序的一部分代码,这些程序非常基本.
pc1 = random.choice(cards)
cca1 = random.choice(cards)
while (pc1 == cca1):
cca1 = random.choice(cards)
ccb1 = random.choice(cards)
while (pc1 == ccb1) or (cca1 == ccb1):
ccb1 = random.choice(cards)
Run Code Online (Sandbox Code Playgroud)
pc1
,cca1
而ccb1
只是变量名,缩短了易用性.这部分代码的作用是尝试从名为cards的字典中获取3个条目.它使用while函数来确保所选卡片不相同; 他们永远是不同的.
这种情况一直持续到我的52字典中有9个唯一变量,除了有时会产生以下错误之外它工作正常:
Traceback (most recent call last):
File "C:\Python33\Programs\Poker\1.0.py", line 231, in <module>
ccc2 = random.choice(cards)
File "C:\Python33\lib\random.py", line 252, in choice
return seq[i]
KeyError: 0
Run Code Online (Sandbox Code Playgroud)
上面(ccc2
)错误中的变量只是先前显示的代码的延续,并且该变量可能导致错误每次都发生变化.
有时只会出现错误(有时程序运行正常,有时会显示错误),并且它出现的行也随着每个外观而变化.我理解我的代码效率低下但我真的只是想停止这个错误,也许还有一些关于如何改进的有用的想法/提示.
再来一次; 做它应该但不明确地返回在看似随机的时间提到的错误与一个看似随机的原因网站.
提前致谢!
我正在尝试一些各种单行解决方案来解决定义变量的问题,只有当它还不存在时才注意到Python会以不同方式处理dicts和lists/tuples.这些错误似乎与我完全平行,所以我很困惑为什么会出现差异.
字典KeyError处理
existing_dict = {"spam": 1, "eggs": 2}
existing_dict["foo"] = existing_dict["foo"] if not KeyError else 3
Run Code Online (Sandbox Code Playgroud)
返回 {"spam": 1, "eggs": 2, "foo": 3}
请注意,我在左侧和右侧都引用了一个不存在的键; Python在出现的任一子句中处理KeyError都没有问题.
List IndexError Handling(对于元组也是如此)
existing_list = ["spam","eggs"]
existing_list[2] = existing_list[2] if not IndexError else ["foo"]
Run Code Online (Sandbox Code Playgroud)
返回 IndexError: list assignment index out of range
解决这个特定错误并不困难(这里回答),但我很好奇为什么这些情况有所不同.在这两种情况下,似乎在受让人/赋值条款中都存在错误,其中一个"if not"错误捕获.
我已经逐步完成了这个并用pdb跟踪检查了每个值,但无法弄清楚为什么我得到一个KeyError,一切都有它的预期值.这是功能:
def get_formatted_timestamp(date_field, time_field):
# expects date_field = yyyy-M-d
# expects time_field = H:m:s
# outputs yyyy-MM-ddTHH:mm:ss:SSSZ ('T' and 'Z' are literals)
dt = date_field.strip().split('/')
tm = time_field.strip().split(':')
if len(dt) != 3 or len(tm) != 3 or len(dt[0]) != 4:
print 'invalid date or time: {} {}'.format(date_field, time_field)
return '1900-01-01T00:00:00.000Z' # error date value
y = dt[0]
M = dt[1] if len(dt[1]) == 2 else '0'+dt[1]
d = dt[2] if len(dt[2]) == 2 else '0'+dt[2]
H = tm[0] if len(tm[0]) …
Run Code Online (Sandbox Code Playgroud) 我的 scrapy 中有这个管道,我需要从 Scrapy 统计信息中获取信息
class MyPipeline(object):
def __init__(self, stats):
self.stats = stats
@classmethod
def from_crawler(cls, crawler):
return cls(crawler.stats)
def process_item(self, item, spider):
print self.stats.get_stats()['item_scraped_count']
return item
Run Code Online (Sandbox Code Playgroud)
当我运行代码时,我收到此错误
Traceback (most recent call last):
File "D:\Kerja\HIT\PYTHON~1\<project_name>\<project_name>\lib\site-packages\twisted\internet\defer.py", line 649, in _runCallbacks
current.result = callback(current.result, *args, **kw)
File "D:\Kerja\HIT\Python Projects\<project_name>\<project_name>\<project_name>\<project_name>\pipelines.py", line 35, in process_item
print self.stats.get_stats()['item_scraped_count']
KeyError: 'item_scraped_count'
Run Code Online (Sandbox Code Playgroud)
如果这不是获取统计值的正确方法,那么我该怎么办?
我试图简化字典上的操作.问题是,有时钥匙不存在,所以我必须首先尝试,KeyError
但我觉得我过度了.
例:
x = {'a': 0, 'b': 0}
for key in ['a', 'b', 'c']:
for i in range(0, 10):
try:
x[key] += i
except KeyError:
x[key] = 0
x[key] += i
Run Code Online (Sandbox Code Playgroud)
正如你在这里看到的,'c'键不存在,所以我先试试.我正在寻找一种方法来跳过尝试部分,如果可能的话.
谢谢!
在这里我得到一个关键错误,即使我检查密钥是否存在于dict中:
def foo(d):
if (('element' in d.keys()) & (d['element'] == 1)):
print "OK"
foo({})
Run Code Online (Sandbox Code Playgroud)
在文档中我们可以阅读:
表达式x和y首先计算x; 如果x为false,则返回其值; 否则,将评估y并返回结果值.
任何人都能解释一下这种行为吗?