我的任务需要 3 个模块——fileutility、choices 和selectiveFileCopy,最后一个导入前两个。
目的是能够有选择地从输入文件复制文本片段,然后将其写入输出文件,由选择模块中的“谓词”确定。如,复制所有内容(choices.always),如果存在特定字符串(choices.contains(x)),或者按长度(choices.shorterThan(x))。
到目前为止,我只有 always() 工作,但它必须接受一个参数,但我的教授特别指出该参数可以是任何东西,甚至什么都没有(?)。这可能吗?如果是这样,我如何编写我的定义以使其起作用?
这个很长的问题的第二部分是为什么我的其他两个谓词不起作用。当我用 docstests(作业的另一部分)对它们进行测试时,它们都通过了。
这是一些代码:
文件实用程序(有人告诉我这个函数没有意义,但它是任务的一部分......) -
def safeOpen(prompt:str, openMode:str, errorMessage:str ):
while True:
try:
return open(input(prompt),openMode)
except IOError:
return(errorMessage)
选择——
def always(x):
"""
always(x) always returns True
>>> always(2)
True
>>> always("hello")
True
>>> always(False)
True
>>> always(2.1)
True
"""
return True
def shorterThan(x:int):
"""
shorterThan(x) returns True if the specified string
is shorter than the specified integer, False is it is not
>>> shorterThan(3)("sadasda")
False
>>> shorterThan(5)("abc")
True
"""
def string (y:str):
return (len(y)<x)
return string
def contains(pattern:str):
"""
contains(pattern) returns True if the pattern specified is in the
string specified, and false if it is not.
>>> contains("really")("Do you really think so?")
True
>>> contains("5")("Five dogs lived in the park")
False
"""
def checker(line:str):
return(pattern in line)
return checker
选择性文件复制-
import fileutility
import choices
def selectivelyCopy(inputFile,outputFile,predicate):
linesCopied = 0
for line in inputFile:
if predicate == True:
outputFile.write(line)
linesCopied+=1
inputFile.close()
return linesCopied
inputFile = fileutility.safeOpen("Input file name: ", "r", " Can't find that file")
outputFile = fileutility.safeOpen("Output file name: ", "w", " Can't create that file")
predicate = eval(input("Function to use as a predicate: "))
print("Lines copied =",selectivelyCopy(inputFile,outputFile,predicate))