[QGIS-Developer] free variable 'self' referenced before assignment in enclosing scope

Nyall Dawson nyall.dawson at gmail.com
Thu Jan 31 15:21:02 PST 2019


On Thu, 31 Jan 2019 at 02:46, Bjørn Burr Nyberg <Bjorn.Nyberg at uib.no> wrote:
>
> Dear QGIS community,
>
> In the spirit of open-source I am trying to convert a set of scripts that ive designed in ArcMap to QGIS 3.x. I hope that this will enable a broader community of individuals to use the workflows ive designed. The original scripts can be found at https://github.com/BjornNyberg/NetworkGT/tree/master/Scripts

Great!

> My problem is that in my first attempt to convert the scripts, QGIS either crashes or gives the following error.
>
> 2019-01-30T16:51:27     WARNING    Traceback (most recent call last):
>               File "C:/PROGRA~1/QGIS3~1.4/apps/qgis/./python/plugins\processing\gui\AlgorithmDialog.py", line 238, in on_complete
>               self.feedback.pushInfo(self.tr('Execution completed in {0:0.2f} seconds').format(time.time() - start_time))
>              NameError: free variable 'self' referenced before assignment in enclosing scope
>

This was a bug fixed already - are you on QGIS 3.4?

Anyone, the problem stems from this line:

    templines = st.run('native:splitwithlines',parameters)

This should be:

    templines =
st.run('native:splitwithlines',parameters,context=context,
feedback=feedback)

I.e. you need to pass the child algorithm the context and feedback
objects given to your algorithm, to allow that child algorithm to push
feedback messages and access existing map layers.


Two other suggestions:

            except Exception as e:

feedback.pushInfo(QCoreApplication.translate('Sample_Area','%s'%(e)))

Here this would be better as:

            except Exception as e:

feedback.reportError(QCoreApplication.translate('Sample_Area','%s'%(e)))

(reportError instead of pushInfo)

And

for part in geom: #Check for multipart polyline
    parts.append(QgsGeometry.fromPolyline(part)) #intersected geometry

This should be

for part in geom.asGeometryCollection(): #Check for multipart polyline
    parts.append(QgsGeometry.fromPolyline(part)) #intersected geometry

(or, nicer for 3.4):

for part in geom.parts(): #Check for multipart polyline
    parts.append(QgsGeometry.fromPolyline(part)) #intersected geometry


Hope that helps!
Nyall






> I have established that this error occurs at the very end of the script when calling ' return {self.Branches:dest_id,self.Nodes:dest_id2}'. I do not believe that I have explicitly defined self  anywhere in the processAlgorithm function itself. The algorithms themselves work as intended and the shapefiles are created before the program crashes.
>
> I am not a programmer by trait so I'm not entirely sure how to problem solve this error and any help would be most appreciated. I can also provide a test dataset if that is helpful.
>
> Cheers,
> Bjorn
> -----------------------------
> Postdoctoral Fellow
> Department of Earth Science, University of Bergen
> PO Box 7803, 5020, Bergen, Norway
> +47 485 024 08
>
>
> _______________________________________________
> QGIS-Developer mailing list
> QGIS-Developer at lists.osgeo.org
> List info: https://lists.osgeo.org/mailman/listinfo/qgis-developer
> Unsubscribe: https://lists.osgeo.org/mailman/listinfo/qgis-developer


More information about the QGIS-Developer mailing list