昨晚我正在解决一个问题,遇到了一些Redhat 6 Linux shell代码,其中一些嵌入式python代码用于将一个文件追加到另一个文件。我遇到找不到文件错误。由于这是生产代码,因此我隔离并检查了此python语句的逻辑:
if os.path.isfile(str(sys.argv[1]) and str(sys.argv[2])):
[do the append stuff]
else:
print("Error: Input file(s) do not exist")
在其他语言中,我希望对os.path.isfile进行两次迭代...
我用两个任意文件“ file1”和“ file2”进行了测试,发现有些奇怪的行为。
append.py "file1" "file2"
会按预期触发附加代码
append.py "file1" "file2x"
触发错误消息
append.py "file1x" "file2x"
触发错误消息
append.py "file1x" "file2"
触发附加代码-不需要!
我没想到这最后一次;并可能解释了我的生产问题。
我尝试了类似的操作(很抱歉,无法从安全环境复制粘贴内容,从内存中读取):
if (os.path.isfile(str(sys.argv[1])) and os.path.isfile(str(sys.argv[2]))):
但是得到了相同的结果..所以我现在认为这是另一回事。
为什么第一个操作数被错误地评估为存在?
答案 0 :(得分:1)
在您的情况下,表达式
import React, { Component } from 'react';
import _ from 'lodash';
import { connect } from 'react-redux';
import {UserCreateEdit} from "../../../core";
import { saveUser } from "../../../core";
import { withRouter } from "react-router-dom";
class UserForm extends UserCreateEdit {
constructor(props) {
super(props);
this.state = {
fields: [
...this.state.fields,
{
"label": "Phone",
"name": "phone",
"type": "text",
"placeholder": "Phone",
"options": ""
}
],
title:"Restaurant: New User"
};
}
// render() {
// return (<div style={{ margin: 20 }}>
// <UserCreateEdit fields={this.state.fields} title={'Restaurant: New User'} />
// </div>);
// }
}
const mapStateToProps = state => ({
status: _.get(state, 'users.data.status', [])
});
const mapDispatchToProps = dispatch => ({
saveUser: (payload) => dispatch(saveUser(payload))
});
export default withRouter(connect(mapStateToProps, mapDispatchToProps)(UserForm));
第一个参数为os.path.isfile(str(sys.argv[1]) and str(sys.argv[2]))
,第二个参数为"file1x"
简化为
"file2"
减少到
os.path.isfile(str("file1x") and str("file2"))
是
os.path.isfile("file2")
记住
True
如果x and y
是真实的,则求值为y
!
请参见the docs
x和y->如果x为假,则为x,否则为y
答案 1 :(得分:0)
实际上,代码检查file1
是否存在,或者如果为空,则退回到检查file2
是否存在。 a and b
如果正确,则返回a
,否则返回b
。
根据定义,sys.argv
的元素是字符串,因此str()
的调用是多余的无操作。
如果要检查两个文件是否都存在,则尝试的更新代码应该可以使用。或者,您可以执行类似的操作
if all(os.file.isfile(x) for x in sys.argv[1:]):
print("all these exist and are regular files: {0}".format(sys.argv[1:]))
具有吸引人的附加功能,它不会对预期数量的参数进行硬编码。