You might consider putting the "type" label inside an Association itself. This will complicate key addressing but simplify other handling. asc = <|"atomData" -> <|"Atom Names" -> {"N", "C", "O", "C", "H", "H"}, "Atom Nr" -> {56, 23, 117, 81, 211, 5}, "Resname" -> {ALA, ALA, TYR, LEU, GLY, GLY}, "Bias Value" -> {1, 5, 1, 5, 1, 1}, "getRandomAtom" :> RandomChoice[{56, 23, 117, 81, 211, 5}], "atomExists" :> (MemberQ[{"N", "C", "O", "C", "H", "H"}, #] &)|>|>; aDtest[a_Association /; Keys[a] === {"atomData"}] := True; f1[a_?aDtest, args__] := a[[1]]["getRandomAtom"] + Total[a[[1]]["Atom Nr"]] f1[asc, 2] > 549 Using `a[[1]]` each time is only one way to approach this; others include: f1[aa_?aDtest, args__] := With[{a = aa[[1]]}, a["getRandomAtom"] + Total[a["Atom Nr"]]] Or: f1[a_?aDtest, args__] := f1core[a[[1]], args] f1core[a_, args__] := a["getRandomAtom"] + Total[a["Atom Nr"]] ---------- ## For *Mathematica&* 10.4 or later The method above can be improved for recent versions of *Mathematica* as follows: ClearAll[f1] p1 = <|"atomData" -> a_|>; f1[p1, args__] := a["getRandomAtom"] + Total[a["Atom Nr"]] f1[asc, 2] > 549 Reference: - https://mathematica.stackexchange.com/q/55526/121