Python, используйте глобальную переменную из функции в другом .py файле / NameError - PullRequest
0 голосов
/ 25 марта 2020

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' не определено

Ответы [ 2 ]

1 голос
/ 25 марта 2020

Я бы переопределил функцию, чтобы она возвращала значение, включающее метаданные о том, какой тип имени файла был передан. Один пример:

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],
                ...}

Вероятно, ваши регулярные выражения могут быть определены с помощью групп захвата, чтобы избежать необходимости впоследствии разбивать имя файла; если шаблон соответствует, возвращаемое значение уже будет содержать соответствующие компоненты.

Тогда в вашей основной программе:

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'], ...]))
0 голосов
/ 25 марта 2020
Опция

с группами захвата:

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')
                }
...