<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Python Toolbox Parameter Validation Not running in ArcGIS Pro Questions</title>
    <link>https://community.esri.com/t5/arcgis-pro-questions/python-toolbox-parameter-validation-not-running/m-p/1552613#M89527</link>
    <description>&lt;P&gt;I have a long and complex python tool. In brief, I can't seem to get the default values for my tool, or any parameter updates for that matter, to work through my UpdateParameters definition. UpdateMessages for whatever reason, does seem to be functional in the full script. Thanks in advance for the insight.&lt;/P&gt;&lt;P&gt;Partial code below.&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Sample Code&lt;/STRONG&gt;&lt;/P&gt;&lt;BLOCKQUOTE&gt;&lt;P&gt;"""Imports and installs"""&lt;BR /&gt;import arcpy, pandas as pd, datetime as dt, numpy as np, os&lt;BR /&gt;from collections import namedtuple&lt;BR /&gt;from scipy.optimize import curve_fit&lt;BR /&gt;# from plotnine import ggplot, aes, geom_point&lt;BR /&gt;# from sklearn.metrics import r2_score, mean_squared_error&lt;BR /&gt;&lt;BR /&gt;temp = "in_memory" # Using in-memory workspace for temporary processing&lt;BR /&gt;timestamp = dt.datetime.now().strftime("%Y_%m_%d_%H_%M") # Global timestamp in the format YYYY_MM_DD_HH_MM&lt;BR /&gt;&lt;BR /&gt;class Toolbox:&lt;BR /&gt;def __init__(self):&lt;BR /&gt;"""Define the toolbox (the name of the toolbox is the name of the .pyt file)"""&lt;BR /&gt;self.label = "xyzx"&lt;BR /&gt;self.alias = "xyzx"&lt;BR /&gt;&lt;BR /&gt;# List of tool classes associated with this toolbox&lt;BR /&gt;self.tools = [xyzx]&lt;BR /&gt;&lt;BR /&gt;class xyzx:&lt;BR /&gt;def __init__(self):&lt;BR /&gt;"""Define the tool (tool name is the name of the class)."""&lt;BR /&gt;self.label = "xyzx"&lt;BR /&gt;self.description = "xyzx"&lt;BR /&gt;self.param_dict = {} # Initialize empty parameter dictionary&lt;BR /&gt;self.getParameterInfo() # Call to initialize parameters&lt;BR /&gt;&lt;BR /&gt;def create_parameter(self, param_displayname, param_name, param_datatype, param_type, param_direction, param_category, param_enabled=True, param_filtertype=None, param_filterlist=None, param_columns=None, param_values=None):&lt;BR /&gt;"""Helper function to create parameters for ArcGIS Pro toolbox."""&lt;BR /&gt;&lt;BR /&gt;param = arcpy.Parameter(&lt;BR /&gt;displayName=param_displayname,&lt;BR /&gt;name=param_name,&lt;BR /&gt;datatype=param_datatype,&lt;BR /&gt;parameterType=param_type,&lt;BR /&gt;direction=param_direction,&lt;BR /&gt;category=param_category,&lt;BR /&gt;enabled=param_enabled&lt;BR /&gt;)&lt;BR /&gt;&lt;BR /&gt;if param_filtertype:&lt;BR /&gt;param.filter.type = param_filtertype&lt;BR /&gt;param.filter.list = param_filterlist&lt;BR /&gt;if param_columns:&lt;BR /&gt;param.columns = param_columns&lt;BR /&gt;if param_values:&lt;BR /&gt;param.values = param_values&lt;BR /&gt;&lt;BR /&gt;return param&lt;BR /&gt;&lt;BR /&gt;def getParameterInfo(self):&lt;BR /&gt;"""Define the tool parameters."""&lt;BR /&gt;&lt;BR /&gt;params = [&lt;BR /&gt;self.create_parameter("Model Initialization Year", "year_init", "GPLong", "Required", "Input", "Model Initialization Terms"),&lt;BR /&gt;self.create_parameter("Model Horizon Year", "year_hori", "GPLong", "Required", "Input", "Model Initialization Terms"),&lt;BR /&gt;self.create_parameter("Formatting Run", "trig_rmod", "GPBoolean", "Required", "Input", "Model Initialization Terms"),&lt;BR /&gt;self.create_parameter("Model Initialization Table", "init_tbl", "DETable", "Optional", "Input", "Model Initialization Terms"),&lt;BR /&gt;self.create_parameter("User Control Table", "uc_tbl", "DETable", "Optional", "Input", "Model Initialization Terms"),&lt;BR /&gt;self.create_parameter("Output Directory", "out_dir", "DEWorkspace", "Required", "Output", "Model Initialization Terms"),&lt;BR /&gt;]&lt;BR /&gt;&lt;BR /&gt;# Create a dictionary for easy access&lt;BR /&gt;self.param_dict = {param.name: param for param in params}&lt;BR /&gt;&lt;BR /&gt;return params&lt;BR /&gt;&lt;BR /&gt;def isLicensed(self):&lt;BR /&gt;"""Set whether the tool is licensed to execute."""&lt;BR /&gt;return True&lt;BR /&gt;&lt;BR /&gt;def updateParameters(self, parameters):&lt;BR /&gt;"""Modify the values and properties of parameters before internal&lt;BR /&gt;validation is performed. This method is called whenever a parameter&lt;BR /&gt;has been changed."""&lt;BR /&gt;&lt;BR /&gt;"""Set default values."""&lt;BR /&gt;default_values = {&lt;BR /&gt;'year_init': dt.date.today().year + 1,&lt;BR /&gt;'year_hori': dt.date.today().year + 41,&lt;BR /&gt;}&lt;BR /&gt;&lt;BR /&gt;for param, default in default_values.items():&lt;BR /&gt;if self.param_dict[param].value is None:&lt;BR /&gt;self.param_dict[param].value = default&lt;BR /&gt;&lt;BR /&gt;return&lt;BR /&gt;&lt;BR /&gt;def updateMessages(self, parameters):&lt;BR /&gt;"""Modify the messages created by internal validation for each tool&lt;BR /&gt;parameter. This method is called after internal validation."""&lt;BR /&gt;&lt;BR /&gt;return&lt;BR /&gt;&lt;BR /&gt;def dir_setup(self, output_directory):&lt;BR /&gt;"""Setup the runtime directory in the specified location."""&lt;BR /&gt;print("Creating runtime directory...")&lt;BR /&gt;&lt;BR /&gt;root_path = f"{output_directory}/xyzx_Run_{timestamp}"&lt;BR /&gt;plot_path = f"{root_path}/summary_plots"&lt;BR /&gt;gdb_path = f"{root_path}/xyzx_Run_{timestamp}"&lt;BR /&gt;&lt;BR /&gt;try:&lt;BR /&gt;print("Creating runtime folders...")&lt;BR /&gt;&lt;BR /&gt;os.makedirs(root_path, exist_ok=False) # create runtime root directory&lt;BR /&gt;os.makedirs(plot_path, exist_ok=False) # create runtime plot directory&lt;BR /&gt;&lt;BR /&gt;print("Creating runtime geodatabase...")&lt;BR /&gt;arcpy.CreateFileGDB_management(*os.path.split(output_directory))&lt;BR /&gt;&lt;BR /&gt;print(f"Runtime saved to: {root_path}")&lt;BR /&gt;except Exception as e:&lt;BR /&gt;print(f"Failed to create runtime directory: {e}")&lt;BR /&gt;&lt;BR /&gt;return root_path, plot_path, gdb_path&lt;BR /&gt;&lt;BR /&gt;def init_tbl(self, root_path):&lt;BR /&gt;"""Create the runtime initialization settings table."""&lt;BR /&gt;print("Creating a runtime initialization file...")&lt;BR /&gt;&lt;BR /&gt;# Extract parameter names and values from param_dict&lt;BR /&gt;mi_data = [(name, param.value) for name, param in self.param_dict.items()]&lt;BR /&gt;mi_df = pd.DataFrame(mi_data, columns=['Parameter', 'Value'])&lt;BR /&gt;&lt;BR /&gt;# Create an init filepath&lt;BR /&gt;filename = f"UrCGM_InitFile_{timestamp}.csv"&lt;BR /&gt;init_path = os.path.join(root_path, filename)&lt;BR /&gt;&lt;BR /&gt;# Save the DataFrame to CSV&lt;BR /&gt;try:&lt;BR /&gt;mi_df.to_csv(init_path, sep='\t', encoding='utf-8', index=False)&lt;BR /&gt;print(f"Model initialization file saved to: {init_path}.")&lt;BR /&gt;except Exception as e:&lt;BR /&gt;print(f"Failed to save model initialization file: {e}")&lt;BR /&gt;&lt;BR /&gt;return init_path&lt;BR /&gt;&lt;BR /&gt;def uc_tbl(self, root_path):&lt;BR /&gt;"""Check if uct is provided; create the uct if not."""&lt;BR /&gt;&lt;BR /&gt;# Access the 'uct' parameter from param_dict&lt;BR /&gt;uct_param = self.param_dict.get("uct")&lt;BR /&gt;&lt;BR /&gt;if not uct_param or not uct_param.value:&lt;BR /&gt;print("User control table not provided. Creating the table...")&lt;BR /&gt;&lt;BR /&gt;# Extract parameter names and values&lt;BR /&gt;uct_data = [(name, param.value) for name, param in self.param_dict.items()]&lt;BR /&gt;uct_df = pd.DataFrame(uct_data, columns=['Parameter', 'Value'])&lt;BR /&gt;&lt;BR /&gt;# Create the uct file path&lt;BR /&gt;filename = "UrCGM_UCT.csv"&lt;BR /&gt;uct_path = os.path.join(root_path, filename)&lt;BR /&gt;&lt;BR /&gt;try:&lt;BR /&gt;uct_df.to_csv(uct_path, sep='\t', encoding='utf-8', index=False)&lt;BR /&gt;print(f"User control table saved to: {uct_path}.")&lt;BR /&gt;except Exception as e:&lt;BR /&gt;print(f"Failed to save user control table: {e}")&lt;BR /&gt;&lt;BR /&gt;else:&lt;BR /&gt;print(f"User control table provided: {uct_param.value}")&lt;BR /&gt;&lt;BR /&gt;return uct_param.value if uct_param else None # Return the uct path&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;def execute(self, parameters, messages):&lt;BR /&gt;"""The source code of the tool."""&lt;BR /&gt;&lt;BR /&gt;try:&lt;BR /&gt;# User-specified output directory&lt;BR /&gt;output_directory = next(p for p in parameters if p.name == "out_dir").valueAsText&lt;BR /&gt;&lt;BR /&gt;# Call the dir_setup function with user output directory&lt;BR /&gt;root_path, plot_path, gdb_path = self.dir_setup(output_directory)&lt;BR /&gt;&lt;BR /&gt;# Call the init_tbl function to create the initialization table&lt;BR /&gt;init_path = self.init_tbl(parameters, root_path)&lt;BR /&gt;&lt;BR /&gt;# Call the uc_tbl function to create the initialization table&lt;BR /&gt;uct_path = self.uc_tbl(parameters, root_path)&lt;BR /&gt;&lt;BR /&gt;# Only run the model where it is not a formatting run&lt;BR /&gt;if self.param_dict['trig_rmod'].value == 0:&lt;BR /&gt;None&lt;BR /&gt;&lt;BR /&gt;except Exception as e:&lt;BR /&gt;print(f"An error occurred during execution: {e}")&lt;BR /&gt;&lt;BR /&gt;return&lt;BR /&gt;&lt;BR /&gt;def postExecute(self, parameters):&lt;BR /&gt;"""This method takes place after outputs are processed and&lt;BR /&gt;added to the display."""&lt;BR /&gt;&lt;BR /&gt;return&lt;/P&gt;&lt;/BLOCKQUOTE&gt;</description>
    <pubDate>Sun, 27 Oct 2024 04:02:18 GMT</pubDate>
    <dc:creator>UnsoughtNine</dc:creator>
    <dc:date>2024-10-27T04:02:18Z</dc:date>
    <item>
      <title>Python Toolbox Parameter Validation Not running</title>
      <link>https://community.esri.com/t5/arcgis-pro-questions/python-toolbox-parameter-validation-not-running/m-p/1552613#M89527</link>
      <description>&lt;P&gt;I have a long and complex python tool. In brief, I can't seem to get the default values for my tool, or any parameter updates for that matter, to work through my UpdateParameters definition. UpdateMessages for whatever reason, does seem to be functional in the full script. Thanks in advance for the insight.&lt;/P&gt;&lt;P&gt;Partial code below.&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Sample Code&lt;/STRONG&gt;&lt;/P&gt;&lt;BLOCKQUOTE&gt;&lt;P&gt;"""Imports and installs"""&lt;BR /&gt;import arcpy, pandas as pd, datetime as dt, numpy as np, os&lt;BR /&gt;from collections import namedtuple&lt;BR /&gt;from scipy.optimize import curve_fit&lt;BR /&gt;# from plotnine import ggplot, aes, geom_point&lt;BR /&gt;# from sklearn.metrics import r2_score, mean_squared_error&lt;BR /&gt;&lt;BR /&gt;temp = "in_memory" # Using in-memory workspace for temporary processing&lt;BR /&gt;timestamp = dt.datetime.now().strftime("%Y_%m_%d_%H_%M") # Global timestamp in the format YYYY_MM_DD_HH_MM&lt;BR /&gt;&lt;BR /&gt;class Toolbox:&lt;BR /&gt;def __init__(self):&lt;BR /&gt;"""Define the toolbox (the name of the toolbox is the name of the .pyt file)"""&lt;BR /&gt;self.label = "xyzx"&lt;BR /&gt;self.alias = "xyzx"&lt;BR /&gt;&lt;BR /&gt;# List of tool classes associated with this toolbox&lt;BR /&gt;self.tools = [xyzx]&lt;BR /&gt;&lt;BR /&gt;class xyzx:&lt;BR /&gt;def __init__(self):&lt;BR /&gt;"""Define the tool (tool name is the name of the class)."""&lt;BR /&gt;self.label = "xyzx"&lt;BR /&gt;self.description = "xyzx"&lt;BR /&gt;self.param_dict = {} # Initialize empty parameter dictionary&lt;BR /&gt;self.getParameterInfo() # Call to initialize parameters&lt;BR /&gt;&lt;BR /&gt;def create_parameter(self, param_displayname, param_name, param_datatype, param_type, param_direction, param_category, param_enabled=True, param_filtertype=None, param_filterlist=None, param_columns=None, param_values=None):&lt;BR /&gt;"""Helper function to create parameters for ArcGIS Pro toolbox."""&lt;BR /&gt;&lt;BR /&gt;param = arcpy.Parameter(&lt;BR /&gt;displayName=param_displayname,&lt;BR /&gt;name=param_name,&lt;BR /&gt;datatype=param_datatype,&lt;BR /&gt;parameterType=param_type,&lt;BR /&gt;direction=param_direction,&lt;BR /&gt;category=param_category,&lt;BR /&gt;enabled=param_enabled&lt;BR /&gt;)&lt;BR /&gt;&lt;BR /&gt;if param_filtertype:&lt;BR /&gt;param.filter.type = param_filtertype&lt;BR /&gt;param.filter.list = param_filterlist&lt;BR /&gt;if param_columns:&lt;BR /&gt;param.columns = param_columns&lt;BR /&gt;if param_values:&lt;BR /&gt;param.values = param_values&lt;BR /&gt;&lt;BR /&gt;return param&lt;BR /&gt;&lt;BR /&gt;def getParameterInfo(self):&lt;BR /&gt;"""Define the tool parameters."""&lt;BR /&gt;&lt;BR /&gt;params = [&lt;BR /&gt;self.create_parameter("Model Initialization Year", "year_init", "GPLong", "Required", "Input", "Model Initialization Terms"),&lt;BR /&gt;self.create_parameter("Model Horizon Year", "year_hori", "GPLong", "Required", "Input", "Model Initialization Terms"),&lt;BR /&gt;self.create_parameter("Formatting Run", "trig_rmod", "GPBoolean", "Required", "Input", "Model Initialization Terms"),&lt;BR /&gt;self.create_parameter("Model Initialization Table", "init_tbl", "DETable", "Optional", "Input", "Model Initialization Terms"),&lt;BR /&gt;self.create_parameter("User Control Table", "uc_tbl", "DETable", "Optional", "Input", "Model Initialization Terms"),&lt;BR /&gt;self.create_parameter("Output Directory", "out_dir", "DEWorkspace", "Required", "Output", "Model Initialization Terms"),&lt;BR /&gt;]&lt;BR /&gt;&lt;BR /&gt;# Create a dictionary for easy access&lt;BR /&gt;self.param_dict = {param.name: param for param in params}&lt;BR /&gt;&lt;BR /&gt;return params&lt;BR /&gt;&lt;BR /&gt;def isLicensed(self):&lt;BR /&gt;"""Set whether the tool is licensed to execute."""&lt;BR /&gt;return True&lt;BR /&gt;&lt;BR /&gt;def updateParameters(self, parameters):&lt;BR /&gt;"""Modify the values and properties of parameters before internal&lt;BR /&gt;validation is performed. This method is called whenever a parameter&lt;BR /&gt;has been changed."""&lt;BR /&gt;&lt;BR /&gt;"""Set default values."""&lt;BR /&gt;default_values = {&lt;BR /&gt;'year_init': dt.date.today().year + 1,&lt;BR /&gt;'year_hori': dt.date.today().year + 41,&lt;BR /&gt;}&lt;BR /&gt;&lt;BR /&gt;for param, default in default_values.items():&lt;BR /&gt;if self.param_dict[param].value is None:&lt;BR /&gt;self.param_dict[param].value = default&lt;BR /&gt;&lt;BR /&gt;return&lt;BR /&gt;&lt;BR /&gt;def updateMessages(self, parameters):&lt;BR /&gt;"""Modify the messages created by internal validation for each tool&lt;BR /&gt;parameter. This method is called after internal validation."""&lt;BR /&gt;&lt;BR /&gt;return&lt;BR /&gt;&lt;BR /&gt;def dir_setup(self, output_directory):&lt;BR /&gt;"""Setup the runtime directory in the specified location."""&lt;BR /&gt;print("Creating runtime directory...")&lt;BR /&gt;&lt;BR /&gt;root_path = f"{output_directory}/xyzx_Run_{timestamp}"&lt;BR /&gt;plot_path = f"{root_path}/summary_plots"&lt;BR /&gt;gdb_path = f"{root_path}/xyzx_Run_{timestamp}"&lt;BR /&gt;&lt;BR /&gt;try:&lt;BR /&gt;print("Creating runtime folders...")&lt;BR /&gt;&lt;BR /&gt;os.makedirs(root_path, exist_ok=False) # create runtime root directory&lt;BR /&gt;os.makedirs(plot_path, exist_ok=False) # create runtime plot directory&lt;BR /&gt;&lt;BR /&gt;print("Creating runtime geodatabase...")&lt;BR /&gt;arcpy.CreateFileGDB_management(*os.path.split(output_directory))&lt;BR /&gt;&lt;BR /&gt;print(f"Runtime saved to: {root_path}")&lt;BR /&gt;except Exception as e:&lt;BR /&gt;print(f"Failed to create runtime directory: {e}")&lt;BR /&gt;&lt;BR /&gt;return root_path, plot_path, gdb_path&lt;BR /&gt;&lt;BR /&gt;def init_tbl(self, root_path):&lt;BR /&gt;"""Create the runtime initialization settings table."""&lt;BR /&gt;print("Creating a runtime initialization file...")&lt;BR /&gt;&lt;BR /&gt;# Extract parameter names and values from param_dict&lt;BR /&gt;mi_data = [(name, param.value) for name, param in self.param_dict.items()]&lt;BR /&gt;mi_df = pd.DataFrame(mi_data, columns=['Parameter', 'Value'])&lt;BR /&gt;&lt;BR /&gt;# Create an init filepath&lt;BR /&gt;filename = f"UrCGM_InitFile_{timestamp}.csv"&lt;BR /&gt;init_path = os.path.join(root_path, filename)&lt;BR /&gt;&lt;BR /&gt;# Save the DataFrame to CSV&lt;BR /&gt;try:&lt;BR /&gt;mi_df.to_csv(init_path, sep='\t', encoding='utf-8', index=False)&lt;BR /&gt;print(f"Model initialization file saved to: {init_path}.")&lt;BR /&gt;except Exception as e:&lt;BR /&gt;print(f"Failed to save model initialization file: {e}")&lt;BR /&gt;&lt;BR /&gt;return init_path&lt;BR /&gt;&lt;BR /&gt;def uc_tbl(self, root_path):&lt;BR /&gt;"""Check if uct is provided; create the uct if not."""&lt;BR /&gt;&lt;BR /&gt;# Access the 'uct' parameter from param_dict&lt;BR /&gt;uct_param = self.param_dict.get("uct")&lt;BR /&gt;&lt;BR /&gt;if not uct_param or not uct_param.value:&lt;BR /&gt;print("User control table not provided. Creating the table...")&lt;BR /&gt;&lt;BR /&gt;# Extract parameter names and values&lt;BR /&gt;uct_data = [(name, param.value) for name, param in self.param_dict.items()]&lt;BR /&gt;uct_df = pd.DataFrame(uct_data, columns=['Parameter', 'Value'])&lt;BR /&gt;&lt;BR /&gt;# Create the uct file path&lt;BR /&gt;filename = "UrCGM_UCT.csv"&lt;BR /&gt;uct_path = os.path.join(root_path, filename)&lt;BR /&gt;&lt;BR /&gt;try:&lt;BR /&gt;uct_df.to_csv(uct_path, sep='\t', encoding='utf-8', index=False)&lt;BR /&gt;print(f"User control table saved to: {uct_path}.")&lt;BR /&gt;except Exception as e:&lt;BR /&gt;print(f"Failed to save user control table: {e}")&lt;BR /&gt;&lt;BR /&gt;else:&lt;BR /&gt;print(f"User control table provided: {uct_param.value}")&lt;BR /&gt;&lt;BR /&gt;return uct_param.value if uct_param else None # Return the uct path&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;def execute(self, parameters, messages):&lt;BR /&gt;"""The source code of the tool."""&lt;BR /&gt;&lt;BR /&gt;try:&lt;BR /&gt;# User-specified output directory&lt;BR /&gt;output_directory = next(p for p in parameters if p.name == "out_dir").valueAsText&lt;BR /&gt;&lt;BR /&gt;# Call the dir_setup function with user output directory&lt;BR /&gt;root_path, plot_path, gdb_path = self.dir_setup(output_directory)&lt;BR /&gt;&lt;BR /&gt;# Call the init_tbl function to create the initialization table&lt;BR /&gt;init_path = self.init_tbl(parameters, root_path)&lt;BR /&gt;&lt;BR /&gt;# Call the uc_tbl function to create the initialization table&lt;BR /&gt;uct_path = self.uc_tbl(parameters, root_path)&lt;BR /&gt;&lt;BR /&gt;# Only run the model where it is not a formatting run&lt;BR /&gt;if self.param_dict['trig_rmod'].value == 0:&lt;BR /&gt;None&lt;BR /&gt;&lt;BR /&gt;except Exception as e:&lt;BR /&gt;print(f"An error occurred during execution: {e}")&lt;BR /&gt;&lt;BR /&gt;return&lt;BR /&gt;&lt;BR /&gt;def postExecute(self, parameters):&lt;BR /&gt;"""This method takes place after outputs are processed and&lt;BR /&gt;added to the display."""&lt;BR /&gt;&lt;BR /&gt;return&lt;/P&gt;&lt;/BLOCKQUOTE&gt;</description>
      <pubDate>Sun, 27 Oct 2024 04:02:18 GMT</pubDate>
      <guid>https://community.esri.com/t5/arcgis-pro-questions/python-toolbox-parameter-validation-not-running/m-p/1552613#M89527</guid>
      <dc:creator>UnsoughtNine</dc:creator>
      <dc:date>2024-10-27T04:02:18Z</dc:date>
    </item>
    <item>
      <title>Re: Python Toolbox Parameter Validation Not running</title>
      <link>https://community.esri.com/t5/arcgis-pro-questions/python-toolbox-parameter-validation-not-running/m-p/1552635#M89530</link>
      <description>&lt;P&gt;For those curious, it was the dictionary causing the issue. I was updating the dictionary, not the parameters themselves.&lt;/P&gt;</description>
      <pubDate>Sun, 27 Oct 2024 19:22:12 GMT</pubDate>
      <guid>https://community.esri.com/t5/arcgis-pro-questions/python-toolbox-parameter-validation-not-running/m-p/1552635#M89530</guid>
      <dc:creator>UnsoughtNine</dc:creator>
      <dc:date>2024-10-27T19:22:12Z</dc:date>
    </item>
  </channel>
</rss>

