Given that "curve" variable below is DesignCurve or DesignEdge type such as retrieved by curve = GetRootPart().Bodies[0].Edges[0]:

curveType = curve.Shape.Geometry.GetType()

if curveType == Circle:

# Arc

elif curveType == Line:

# Line

elif curveType == NurbsCurve:

# Spline

elif curveType == PointCurve:

# Point

Sorry, but there is no logic I can report on how the index designation is given for curves/edges.

In scripting, you need to decide your own logic on how you will determine how to retrieve an intended curve/edge. If your script operates on a pre-existing geometry you can place curves/edges into named selection groups first and then have the script get the entities in the named selection for the names of your choice. If your script creates everything, you can use a sortof bottom-up approach (create curves then surfaces from curves, then bodies from surfaces) to creating geometry so you still have the curves (saved to variable) used in creating faces/bodies. And get the returned entities from creation functions. Or maybe you can get certain curves/edges by a simple logic of max/min XYZ for its endpoints. Or maybe you can get certain curves/edges by their connections to other known curves/edges. You need to get a little creative with your logic on how to retrieve intended geometry when scripting.