Select neighbour faces from a mesh with python
does his help? Start with the template in:


TextEditor > Templates > Python > Bmesh Simple Editmode




import bpy
import bmesh

obj = bpy.context.edit_object
me = obj.data

bm = bmesh.from_edit_mesh(me)

face = bm.faces[3]
face.select = True
print(dir(face.verts[0].link_faces))
print(face.verts[0].link_faces[:])

# This gives the list of all edges that use that vertex.
# [&lt;BMFace(0x7f7acb5ddb70), index=52, totverts=4&gt;,    
#  &lt;BMFace(0x7f7acb5ddbe0), index=54, totverts=4&gt;,
#  &lt;BMFace(0x7f7acb5ddba8), index=53, totverts=4&gt;,  
#  &lt;BMFace(0x7f7acb5dd0b8), index=3, totverts=4&gt;]

bmesh.update_edit_mesh(me, True)


There's also link_edges which could also prove useful, arguably more so

import bpy
import bmesh

obj = bpy.context.edit_object
me = obj.data

bm = bmesh.from_edit_mesh(me)

# just assume now there is only one selected face
selected_face = [f for f in bm.faces if f.select][0]

for edge in selected_face.edges:
    linked = edge.link_faces
    for face in linked:
        face.select = True

bmesh.update_edit_mesh(me, True)


produces




And finally, the join command

import bpy
import bmesh

obj = bpy.context.edit_object
me = obj.data

bm = bmesh.from_edit_mesh(me)

# just assume now there are at least 2 selected, and are touching
selected_faces = [f for f in bm.faces if f.select]

# the script equivalent of the F key        
bmesh.ops.contextual_create(bm, geom=selected_faces)

bmesh.update_edit_mesh(me, True)




Regarding your statement about Bmesh being experimental, I wouldn't worry about that too much, it's being used a lot and has proven to be more than capable. The Bmesh.ops docs are an excellent but admittedly terse resource: