我申请了一份工作,他们要求我编写具有以下要求的代码:



http..update.utorrent.com /获取“工具栏要约”说明installoffer.php?offer =管道。解析被编码(请参阅http://en.wikipedia.org/wiki/Bencode)的
响应,然后提取二进制文件的URL及其SHA1哈希。哈希包含在键“ offer_hash”的值中。二进制文件在
键'offer_urls'的列表中-请使用带有前缀
“ http..download.utorrent.com /”的二进制文件。

下载二进制文件并计算其哈希值

验证计算出的SHA1哈希值是否与商品详细信息中提供的哈希值相同。可以将现有的库用于
bencoding,哈希等。


我的代码有什么问题?招聘人员说没有达到他们的要求。

# Script that verifies the correctness of a toolbar offers

import urllib, bencode , hashlib
from hashlib import sha1

url = "http://update.utorrent.com/installoffer.php?offer=conduit"

filename = "content.txt"

f= urllib.urlretrieve(url, filename)

#Bdecoding the response

with open (str(filename), 'rb') as myfile:
           data=myfile.read()
           decoded = bencode.bdecode(data)

# Returning the list for the key 'offer_urls'


list = decoded['offer_urls']

#print list


# Returning the URL of the binary that is prefixed with "http://download3.utorrent.com/"

length = len (list)

prefix = "http://download3.utorrent.com/"

i= -1

while i < length:
     i = i + 1
     if list[i].startswith(prefix) :
        break
binary= list[i]

print "The URL of the the binary is: " , binary


# Returning the sha1 hash contained in the value of the key 'offer_hash'


encrypted_hash = decoded['offer_hash']
sha1_hash1 = encrypted_hash.encode('hex')
print "The sha1 hash contained in the value of the key 'offer_hash' is: " , sha1_hash1 


# Downloading the binary and calculating its hash

urllib.urlretrieve ( binary , "utct2-en-conduit-20130523.exe")
file = "C:\Python27\utct2-en-conduit-20130523.exe"
with open (file, 'rb') as myfile:
           downloaded=myfile.read()

k = hashlib.sha1()
k.update(downloaded)
sha1file = k.hexdigest()
print "The sha1 hash of the downloaded binary is: " , sha1file

# Verify that the calculated sha1 hash is identical to the one provided in the offer details

if (sha1file == sha1_hash1) :
    print "Test result = Pass"
else :
    print "Test result = Fail"


评论

您的代码存在一个非常简单的问题:注释应说明原因,而不是原因。
它确实向您表明了一个实用主义者,当您单独工作时,这很好。

#1 楼

我要告诉您代码中让我感到惊讶的事情。 br />
# Script that verifies the correctness of a toolbar offers

import urllib, bencode , hashlib


使用单字母变量表明对纯净代码的关注不足。
再次将其转换为字符串表示对正在发生的事情感到困惑。

from hashlib import sha1

url = "http://update.utorrent.com/installoffer.php?offer=conduit"

filename = "content.txt"

f= urllib.urlretrieve(url, filename)


大量缩进建议不考虑一致的缩进样式。

下载将该文件存入磁盘然后再将其读入内存,这是对可用API的不良使用。您应该将文件直接下载到内存中。

#Bdecoding the response

with open (str(filename), 'rb') as myfile:


多余的空格表示有人很高兴。

           data=myfile.read()
           decoded = bencode.bdecode(data)


/>“返回”在技术上不正确。您不在函数中,因此不会返回任何内容。使用bencode是变量的坏名称,因为它是内置的Python类型。

# Returning the list for the key 'offer_urls'


在函数调用后放置空格是奇怪的,而您不这样做它始终如一。也很少有理由存储filename的长度。

list = decoded['offer_urls']


list前面没有空格。

#print list


# Returning the URL of the binary that is prefixed with "http://download3.utorrent.com/"

length = len (list)


当您应该使用list循环时,您正在使用=循环。如果找不到前缀,它也会导致while,而不是正常失败。

prefix = "http://download3.utorrent.com/"

i= -1


哈希是否真的加密了?

while i < length:
     i = i + 1
     if list[i].startswith(prefix) :
        break
binary= list[i]


硬编码的文件名很容易破解。您甚至不需要这样做。该字符串还包含for,应将其转义,否则整个字符串应为原始字符串。例如,

print "The URL of the the binary is: " , binary


# Returning the sha1 hash contained in the value of the key 'offer_hash'


encrypted_hash = decoded['offer_hash']




sha1_hash1 = encrypted_hash.encode('hex')
print "The sha1 hash contained in the value of the key 'offer_hash' is: " , sha1_hash1 


# Downloading the binary and calculating its hash

urllib.urlretrieve ( binary , "utct2-en-conduit-20130523.exe")
file = "C:\Python27\utct2-en-conduit-20130523.exe"


,或者在大多数情况下,即使在Windows上,也可以使用其他斜杠。

"C:\Python27\utct2-en-conduit-20130425.exe"


你摆脱了所做的事情,但这主要是因为你很幸运。 >这最后一段代码与上一段代码具有几乎相同的功能,但是您没有使用函数。

r"C:\Python27\utct2-en-conduit-20130425.exe"


您已经加上了括号,

"C:/Python27/utct2-en-conduit-20130425.exe"


您的基本问题:


您的样式很差且不一致
事情表明您不太了解正在发生的事情
您并没有注意使代码可读性

这是我对问题的看法:

评论


\ $ \ begingroup \ $
严厉...但是做得很好。希望这就是医生的命令。
\ $ \ endgroup \ $
–WernerCD
2013年6月27日13:06

\ $ \ begingroup \ $
我对这个答案感到非常困惑,直到我意识到我不再使用StackOverflow了。
\ $ \ endgroup \ $
–鸭鸭
2013年6月27日23:07

\ $ \ begingroup \ $
我不会在多余的部分上讨他喜欢。当您使用多种语言时,最好使用括号来防御,多余的语言也不会造成伤害。
\ $ \ endgroup \ $
–Loren Pechtel
13年6月28日在0:02

\ $ \ begingroup \ $
无论如何,我认为这并不苛刻。如果您上传代码,那么对此进行的批评应该是非常感激的。做得好!
\ $ \ endgroup \ $
–travisbartley
13年6月28日在1:26

\ $ \ begingroup \ $
@WinstonEwert:非常感谢您抽出宝贵的时间为我提供如此详细的答案!!真的有帮助!
\ $ \ endgroup \ $
–user26614
13年7月1日在17:30

#2 楼

通过pep8以及可能更复杂的静态分析器(如pylint)运行代码。

,您会发现这些工具不喜欢某些格式和变量名。他们可能会抱怨变量,分支等太多,因为代码没有分解为模块化函数。

#3 楼

如果我要使用您的代码,然后将其乘以100或一千次到其他文件中(一个常规的商业/企业应用程序的大小,那么这将是狗的早餐,根本无法维护。您需要更加谨慎地使用代码并使其可读性和一致性,将其视为格式化潜在雇主的简历,在字符之间使用一致的空格,在代码上方使用一致的注释(不要在代码之间使用多个换行符),尤其是采用一种通用的语言风格指南,温斯顿(Winston)早些时候就发布了一个很好的例子。人们还必须阅读您编写的代码,并且需要快速理解它。如果他们正在浏览代码,则突然在页面中浮现出随机注释,这真是一种分散注意力的事情。读的好书是Robert Martin的Clean Code。您必须阅读此书,就好像您的生活取决于它。

评论


\ $ \ begingroup \ $
xkcd.com/859)
\ $ \ endgroup \ $
– jkd
17年8月21日在3:18



#4 楼

问题:



我想说import应该是重用库的有效方法。

import urllib, bencode , hashlib
from hashlib import sha1


在上面的代码行中,您从第二行的hashlib导入了sha1hashlib。这没有什么错,但是当您只想使用sha1时,则无需导入整个类。

与其他类相同:您的代码中使用了上述库的多少个成员?

所有常量都应该在脚本开头预定义,而不是

如果上述文件无法打开(如果文件不存在)怎么办?如何处理此异常?

with open (str(filename), 'rb') as myfile:
       downloaded=myfile.read()


使用try-except捕获异常。 >
无需使用额外的变量来存储列表的长度。在函数len和它的arg之间也有一个空格。 >毫无意义的变量名称,例如forwhilei
任务没有很好地划分为不同的子例程。


评论


\ $ \ begingroup \ $
问题8是最大的问题。他的解决方案是事务脚本的典型案例。我讨厌事务脚本,其他人也讨厌。
\ $ \ endgroup \ $
– RokL
2013年12月5日上午11:42