pylance-release icon indicating copy to clipboard operation
pylance-release copied to clipboard

pylance loses link to a object if it was returned by fixture

Open Akopov4 opened this issue 1 year ago • 4 comments

Environment data

  • Language Server version: 2024.4.1
  • OS and version: linux x64
  • Python version (and distribution if applicable, e.g. Anaconda): python3.8 , pip23.2.1,
  • python.analysis.indexing: true
  • python.analysis.typeCheckingMode: basic

Code Snippet

class Cl_1:
    def __init__(self):
       pass
    def some_f1:(self):
       pass
   

class Cl_2:
    def __init__(self):
         self.obj1=Cl_1()
     
     def some_f2:(self):
       pass


  


@fixture
def fixt_1():    
    yield Cl_2()

@fixture
def fixt_2(fixt_1):     
     yield fixt_1

def test_some_test(fixt_2):
      fixt_2.some_f2()
      fixt_2.obj1.some_f1

Repro Steps

  1. XXX

Expected behavior

Test run ok. When I press CTRL+ left mouse click in any of the : fixt_2.some_f2() fixt_2.obj1.some_f1()

I jump into declaration of the appropriate function

Actual behavior

Test runs ok. Inside my test: (function) some_f2: Unknown (function) obj1: Unknown

Logs

vscode_log.txt

XXX

Requirments

[requirements.txt](https://github.com/microsoft/pylance-release/files/14846468/requirements.txt)
XXX

Akopov4 avatar Apr 03 '24 04:04 Akopov4

I did some experiments, this issue is reproducible when the inlay hints are not visible: "editor.inlayHints.enabled": "offUnlessPressed" or "editor.inlayHints.enabled": "off"

Akopov4 avatar Apr 03 '24 15:04 Akopov4

thank you for the issue.

yes there seems to be an issue with fixtures that use yield to return a generator.

there was a slight type in your def somef1:(self) to def somef1(self)

if you set typecheckingmode to basic you should see the errors

for now try adding annotations to the fixture usage

from pytest import fixture


class Cl_1:
    def __init__(self):
       pass
    def some_f1(self):
       pass
   

class Cl_2:
    def __init__(self):
         self.obj1=Cl_1()
     
    def some_f2(self):
       pass


@fixture
def fixt_1():    
    yield Cl_2()

@fixture
def fixt_2(fixt_1: Cl_2):     
     yield fixt_1

def test_some_test(fixt_2: Cl_2):
      fixt_2.some_f2()
      fixt_2.obj1.some_f1



on second thought maybe my annotation is wrong for this def test_some_test(fixt_2: Cl_2):

bschnurr avatar Apr 03 '24 20:04 bschnurr

Hello, is there any movement in this investigation?

Akopov4 avatar Aug 29 '24 03:08 Akopov4

Sorry this hasn't been investigated yet.

rchiodo avatar Aug 29 '24 16:08 rchiodo