為了能夠建立容易辨識的Entity名字,我們在schemas.py內建立一個name_mapping的dict。
要建立name_mapping,需要認識兩個Enum:
GeneralEntityNames儲存各Entity通俗的名字。AutoCreatedEntityNames儲存當各Entity是由script產生,而我們又沒有指定名字的時候,需要添加的前綴字。name_mapping的key為GeneralEntityNames的value,value為AutoCreatedEntityNames的value。透過name_mapping我們就可以藉由通俗的Entity名稱來取得相對應的前綴字。
# schemas.py
from enum import Enum
class GeneralEntityNames(str, Enum):
PART: str = 'part'
SET: str = 'set'
CONTACT: str = 'contact'
MATERIAL: str = 'material'
PROPERTY: str = 'property'
SECTION: str = 'section'
CURVE: str = 'curve'
class AutoCreatedEntityNames(str, Enum):
PART: str = 'auto_part_'
SET: str = 'auto_set_'
CONTACT: str = 'auto_contact_'
MATERIAL: str = 'auto_material_'
PROPERTY: str = 'auto_property_'
SECTION: str = 'auto_section_'
CURVE: str = 'auto_curve_'
name_mapping = dict(zip([member.value for member in GeneralEntityNames], [
member.value for member in AutoCreatedEntityNames]))
接著,我們建立一個_get_name的function來負責建立獨特的名字。這個function先利用name_mapping取得了各Entity的前綴字,接著再加上各Entity的建立時間及一些random的字串(備註)。如此一來,在每個Entity自動建立的時候,都可以有一個容易辨識又不會重覆的名字,例如:auto_material_20220901_15151662189319_ce0fd0。另外,如果名字內有其建立時間的話,於debug查找各Entity建立先後次序時,也會比較方便。
我們將_get_name存於name_fetchers.py,並透過它建立每一種Entity產生名字的function,如get_one_part_name、get_one_set_name及get_one_material_name等。由於我們在_get_name中使用了short circuit的技巧,所以當沒有指定名字的時候,_get_name會自動產生適合的名字;但當有指定名字的時候,則會直接回傳指定的名字,保留了命名的彈性。
# name_fetchers.py
import uuid
from datetime import datetime
from schemas import GeneralEntityNames, name_mapping
def _get_datetime():
return datetime.now().strftime('%Y%m%d_%H%M%s')
def _get_name(general_entity_name, name=None):
return (name or (name_mapping.get(general_entity_name) +
_get_datetime() +
'_' +
uuid.uuid4().hex[:6]))
def get_one_part_name(name=None):
return _get_name(GeneralEntityNames.PART.value, name)
def get_one_set_name(name=None):
return _get_name(GeneralEntityNames.SET.value, name)
def get_one_contact_name(name=None):
return _get_name(GeneralEntityNames.CONTACT.value, name)
def get_one_material_name(name=None):
return _get_name(GeneralEntityNames.MATERIAL.value, name)
def get_one_proprty_name(name=None):
return _get_name(GeneralEntityNames.PROPERTY.value, name)
def get_one_section_name(name=None):
return _get_name(GeneralEntityNames.SECTION.value, name)
def get_one_curve_name(name=None):
return _get_name(GeneralEntityNames.CURVE.value, name)
或許有些先進會覺得_get_datetime已經足以建立一個獨特的名字,我們一開始也是這麼想的。直到我們做到了某些project,需要由外部呼叫ANSA、平行計算、或是使用asyncio的時候,就會遇到一些問題。所以後來才決定在最後,加上一些uuid產生的字串。