Python,使用其他 .py 文件中函数的全局变量/NameError

Python, Use global var from function in other .py file / NameError

get_asset_type_v001.py

import re

def get_asset_type(filename):
    """Check filename for asset type"""
    global is_vfx_file, is_edit_file, proj_yy, client, show, edit_version, edit_stage, tv, pv, date, seq_nr, seq_name, shot_nr, shot_name
    is_vfx_file = False
    is_edit_file = False
    if re.match(edit_pattern, filename):  # Check if file is a edit prev
        print("\nFile is an Edit prev. Filename: {}".format(filename))
        proj_yy, client, show, edit_version, edit_stage, tv, pv, date, *_ = filename.split("_")
        is_edit_file = True
    if re.match(vfx_pattern, filename):  # Check if file is a VFX prev
        print("\nFile is a VFX prev. Filename: {}".format(filename))
        seq_nr, seq_name, shot_nr, shot_name, *_ = filename.split("_")
        is_vfx_file = True

# get_asset_type(sample_vfx_filename) # Call function to return is vfx file and print result
# print(is_vfx_file)  # Check if it's a vfx file

在同一个文件中打印函数非常有效。

print('_'.join(list((seq_nr, seq_name, shot_nr, shot_name))))

main_programm_file_v001.py

from get_asset_type_v001 import *  # Import function ti check what asset type it is


filename = sample_vfx_filename

get_asset_type(filename)  # Code workes fine till this line
print('_'.join(list((seq_nr, seq_name, shot_nr, shot_name))))  # The variables in this line "seq_nr..." are making the problem

但是尝试在另一个文件中使用导入函数的代码会引发以下错误。好像我无法访问全局变量。

NameError: 名称 'seq_nr' 未定义

我会将该函数重新定义为 return 一个值,其中包含有关传递的文件名类型的元数据。一个例子:

import re

def get_asset_type(filename):
    """Check filename for asset type"""
    if re.match(edit_pattern, filename):
        print("\nFile is an Edit prev. Filename: {}".format(filename))
        fields = filename.split("_")
        return {'type': 'edit',
                'proj_yy': fields[0],
                'client': fields[1],
                ...}
    if re.match(vfx_pattern, filename):  # Check if file is a VFX prev
        print("\nFile is a VFX prev. Filename: {}".format(filename))
        fields = filename.split("_")
        return {'type': 'vfx',
                'seq_nr': fields[0],
                'seq_name': fields[1],
                ...}

很可能您的正则表达式可以使用捕获组来定义,以避免随后拆分文件名的需要;如果模式匹配,return 值将已经包含相关组件。

然后在你的主程序中:

import get_asset_type_v001

filename = sample_vfx_filename

result = get_asset_type_v001.get_asset_type(filename)
if result['type'] == 'vfx':
    print('_'.join([result['seq_nr'], result['seq_name'], ...]))

带有捕获组的选项:

def get_asset_type(filename): # V003
    """Check filename for asset type"""
    n = re.match(edit_pattern, filename)
    if n:  # Check if file is a edit prev
        print("\nFile is an Edit prev. Filename: {}".format(filename))
        fields = filename.split("_")
        return {'type': 'edit',
                'proj_yy': n.group('proj_yy'),
                'client': n.group('client'),
                'show': n.group('show'),
                'edit_version': n.group('edit_version'),
                'edit_stage': n.group('edit_stage'),
                'tv': n.group('tv'),
                'pv': n.group('pv'),
                'date': n.group('date'),
                }
    m = re.match(vfx_pattern, filename)
    if m:  # Check if file is a VFX prev
        print("\nFile is a VFX prev. Filename: {}".format(filename))
        print(m.group('seq_name'))
        return {'type': 'vfx',
                'seq_nr': m.group('seq_nr'),
                'seq_name': m.group('seq_name'),
                'shot_nr': m.group('shot_nr'),
                'shot_name': m.group('shot_name')
                }