- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个很长的问题,但答案可能很短。
我是 Python 的新手(现在将近两周),但我使用 VBScript 多年,所以我了解许多基本概念。
我已经在 Stack Overflow 和互联网上搜索了解决方案,但一无所获;我不确定这在 Python 中是否可行,但如果不是,我会感到有点惊讶。我使用 Python3 编写了一个文件搜索程序,允许用户在他们的计算机上搜索文件。用户可以选择基于几个不同的参数进行搜索:名称、大小范围、修改日期范围,对于非 Linux 系统,还有创建日期范围。搜索功能对于每个单独的参数以及参数组合都非常有效(顺便说一句,这在很大程度上要归功于我在 Stack Overflow 上找到的许多答案/讨论)。我的问题是实际的搜索相当不优雅,而且我相信它比它可能的要慢。该程序使用标志(不是真正的 Python 标志,这正是我对它们的称呼)来设置搜索选项。让我用一些伪代码来说明:
# Variables get their values from user entry
sName = "test" # string to search for
sMinSize = 2 # minimum search-by size in MB
sMaxSize = 15 # maximum search-by size in MB
sModded1 = 2008-01-23 # earliest modified-by date
sModded2 = 2017-08-22 # latest modified-by date
sCreated1 = 2008-01-23 # earliest created-by date
sCreated2 = 2017-08-22 # latest created-by date
# Search parameters - choosing one of these changes the value from 0 to 1:
flagName = 0 # search by name
flagSize = 0 # search by size
flagModified = 0 # search by last modified date
flagCreated = 0 # search by last created date
for root, dirs, files in os.walk(strPath, followlinks=False):
for fName in files:
fileDate = os.path.getmtime(fName)
fileSize = os.stat(fName).st_size
if flagName = 1:
if fName.find(sName) > 0:
do_stuff
elif flagSize = 1:
if sMinSize < fileSize < sMaxSize:
do_stuff
elif flagName = 1 and flagSize = 1:
if fName.find(sName) > 0 and if sMinSize < fileSize < sMaxSize:
do_stuff
... etc
只有 3 种可能的组合 - 总共有 14 种。虽然我真的不介意输入所有组合,但我相信这会严重影响搜索的速度和效率。
我想到了另一种更优雅并且可能执行得更快的解决方案,但我仍然认为有更好的方法:
if flagName = 1:
for root, dirs, files in os.walk(strPath, followlinks=False):
for fName in files:
fileDate = os.path.getmtime(fName)
fileSize = os.stat(fName).st_size
if fName.find(sName) > 0:
do_stuff
elif flagName = 1 and flagSize = 1:
for root, dirs, files in os.walk(strPath, followlinks=False):
for fName in files:
fileDate = os.path.getmtime(fName)
fileSize = os.stat(fName).st_size
if fName.find(sName) > 0 and if sMinSize < fileSize < sMaxSize:
do_stuff
... etc
同样,这更加优雅(我相信)更加高效,但仍然不理想。我想做的是根据用户的搜索条件创建一个“if”语句并使用它来进行搜索(请注意,在 VBScript 中可能会出现类似的情况)。这些语句将在搜索语句发生之前出现:
可能的选项 1:
if flagName = 1:
iClause = "fName.find(sName) > 0"
elif flagName = 1 and flagSize = 1:
iClause = "fName.find(sName) > 0 and if sMinSize < fileSize < sMaxSize"
... etc
可能的选项 2:
flagClause = 0
if flagName = 1:
iClause = "fName.find(sName) > 0"
flagClause = flagClause + 1
if flagClause = 0
iClause = "sMinSize < fileSize < sMaxSize"
else:
iClause = iClause + "and sMinSize < fileSize < sMaxSize"
flagClause = flagClause + 1
... etc
然后像这样将“iClause”插入到我的搜索语句中:
for root, dirs, files in os.walk(strPath, followlinks=False):
for fName in files:
fileDate = os.path.getmtime(fName)
fileSize = os.stat(fName).st_size
if **iClause**:
do_stuff
这将简化代码,使其更易于阅读和维护,并且(我相信)使其更加高效和快速。
这可以用 Python 实现吗?
编辑:
感谢大家花时间阅读我冗长的问题,但我不相信你能理解我的问题 - 很可能是因为它(过度)冗长。
我想知道如何实现以下内容:
a = "sMinSize < fileSize < sMaxSize"
b = "and sMinSize < fileSize < sMaxSize"
iClause = a+b
然后将“iClause”插入到我的“if”语句中,如下所示:
if iClause:
do_stuff
这基本上是将字符串文字转换为变量,然后使用该可变(可能不是真实单词)字符串文字作为我的语句。我希望这更清楚。
最佳答案
创建一个谓词函数,每个案例一个。确定您正在使用的案例并使用关联的谓词。将选定的谓词收集到一个列表中(或将它们组合成一个新的谓词)然后应用到你的循环中:
predicates = []
if flagName:
predicates.append(lambda fileName: fileName.find(sName) > 0)
if flagSize:
predicates.append(lambda fileName: sMinSize < os.stat(fileName).st_size < sMaxSize)
if flagModified:
predicates.append(lambda fileName: sModded1 < os.path.getmtime(fileName) < sModded2)
if flagCreated:
predicates.append(lambda fileName: sCreated1 < os.path.getctime(fileName) < sCreated2)
for root, dirs, files in os.walk(strPath, followlinks=False):
for fName in files:
if all(p(fName) for p in predicates):
# do stuff
根据您的喜好,您可能希望使用命名函数而不是 lambda。对于更复杂的场景,您可能希望将它们实现为仿函数。
关于python - 我可以用可变字符串文字替换 Python "If"语句的一部分吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45829153/
我是一名优秀的程序员,十分优秀!