我想在另外两个变量的条件下指定一个str(将用作文件名)。假设我有一个基本名称(指定为str类型),file_name = 'filename.txt'
;我有两个变量,x
和y
,可能是NoneType
或str
。我期望通过以下代码实现我的目标:
if x == None and y == None:
file_name = 'filename.txt'
elif x == 'abc' and y == None:
file_name = 'filename_abc.txt'
elif x == None and y == 'def':
file_name = 'filename_def.txt'
else: # both x and y are str
file_name = 'filename_{}_{}.txt'.format(x, y)
所以基本上,如果x
(或y
)是非NoneType str,则_
中应该有一个额外的下划线file_name
。我可以理解,使用if
和elif
语句可以实现目标。但如果有两个以上(比方说10个)条件变量如x
和y
怎么办?这将是非常漫长的。我想知道是否会有更优雅的方式。
答案 0 :(得分:2)
只需将参数放在list
中,过滤掉None
类型,加入字符串,只需使用format
插入复合字符串:
params = [None,"abc",None,"def",12]
filename = "filename{}.txt".format("".join(["_{}".format(p) for p in params if p is not None]))
print(filename)
这个解决方案可以转换其他参数,比如列表中的整数(如format
会做的那样),也可以正常工作(在Paul的帮助下:) :)只有None
个参数
答案 1 :(得分:2)
这个怎么样?
bits = [s for s in (x, y) if not s is None]
file_name = '_'.join(['filename'] + bits) + '.txt'
答案 2 :(得分:1)
你可以使用一些条件表达式:
Header
这会明确检查fx = '_{}'.format(x) if x else ''
fy = '_{}'.format(y) if y else ''
filename = 'filename{}{}.txt'.format(fx, fy)
和x
的粗暴度,然后调用格式,因此适用y
和x
的所有非假值。
如果您只需要字符串,请将y
替换为if x
,将if isinstance(x, str)
替换为y
。