Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 局部变量可能在赋值之前被引用_Python - Fatal编程技术网

Python 局部变量可能在赋值之前被引用

Python 局部变量可能在赋值之前被引用,python,Python,此工作函数将接收一个字典,该字典将根据传输类型值继续上载或下载文件。但当前我的IDE显示警告当我使用局部变量执行子流程时,它可能在赋值之前被引用 我的问题是,我应该接受在函数(global cmd)中作为一个全局变量进行declating的建议,还是应该忽略这个建议 def scp_transfer(data): host = data['host'] remote = data['remote'] local = data['local'] transfer_

此工作函数将接收一个字典,该字典将根据传输类型值继续上载或下载文件。但当前我的IDE显示警告
当我使用局部变量执行
子流程时,它可能在赋值之前被引用

我的问题是,我应该接受在函数(
global cmd
)中作为一个全局变量进行declating的建议,还是应该忽略这个建议

def scp_transfer(data):

    host = data['host']
    remote = data['remote']
    local = data['local']
    transfer_type = data['transfer_type']

    if transfer_type == 'download':
        cmd = 'scp -qr %s:%s %s' % (host, remote, local)
    if transfer_type == 'upload':
        cmd = 'scp -qr %s %s:%s' % (local, host, remote)

    run = subprocess.run(cmd, shell=True, stdout=subprocess.PIPE)
    try:
        run.check_returncode()
    except subprocess.CalledProcessError as e:
        print(e.output)
    else:
        print(run.stdout.decode('utf-8'))

我会避免将其声明为
全局
。您可以在函数中声明它:

cmd = None
if transfer_type == 'download':
    cmd = 'scp -qr %s:%s %s' % (host, remote, local)
if transfer_type == 'upload':
    cmd = 'scp -qr %s %s:%s' % (local, host, remote)
但是,当您尝试运行
cmd
时,这仍然可能导致问题。相反,如果
transfer\u type
与任何内容都不匹配,则应引发异常

if transfer_type == 'download':
    cmd = 'scp -qr %s:%s %s' % (host, remote, local)
elif transfer_type == 'upload':
    cmd = 'scp -qr %s %s:%s' % (local, host, remote)
else:
    raise ValueError('Unexpected transfer type: %s' % transfer_type)

在任何情况下,我都会注意警告。

警告指的是
cmd
不存在的可能性。是否有可能
transfer\u type
不是“下载”或“上传”?忘记全局变量;如果
transfer\u type
不是“upload”或“download”,您应该抛出异常。不,
global cmd
确实不是这里的答案。它正在将
cmd
设置为一个已知值,或者在
子进程之前进行良好的错误处理并退出。如果
传输类型
不是
“上载”
“下载”
)在最后一行中丢失,则运行(
调用),但我无法编辑它。@thclpr谢谢,我切换到旧的格式来匹配OP的代码。