As Neil mentioned, Posting code with Syntax Highlighting on GeoNet
It looks like the numIDs parameter is supposed to be a number, so you should enforce that. Convert it to an integer so if it's not a number you'll get an error.
numIDs = int(arcpy.GetParameterAsText(0))
Alternatively, take a look at using arcpy.GetParameter() instead and specify the data type as integer when you create the script tool in ArcCatalog.
I haven't tested this code, but here's my take on how you could simplify your code so there's not so much repetition. With a lot of fields like this, I find it helpful to assign the indexes to a plain english variable name so the code is easier to read.
with arcpy.da.UpdateCursor(nodeFeatures, fields) as cursor:
for row in cursor:
ExteNetNodeID = row[0]
ProjectHub = row[1]
ProjectCarrier = row[2]
id1 = row[3]
id2 = row[4]
id3 = row[5]
id4 = row[6]
id5 = row[7]
id6 = row[8]
id7 = row[9]
id8 = row[10]
id9 = row[11]
id10 = row[12]
if numIDs == 0:
for i in range(3, 10+3):
row[i] = None
else:
for i in range(3, numIDs+3):
row[i] = "({}) - ({}) - ({}) - ({})".format(
ExteNetNodeID,
ProjectHub,
ProjectCarrier,
"{:02d}".format(i-2)
)
cursor.updateRow(row)
EDIT:
To answer your original question
The question with this script is, should there be additional parameters in the line <cursor.da.updateRow(row)
No, updateRow() only takes that one parameter as "a list or tuple of values. The order of values should be in the same order as the fields."
Python