I am looking through the pytest documentation, and there is a small detail that is driving me crazy.
I'm currently looking at the documentation for this page, and it gives the following example:
import pytest
class Fruit:
    def __init__(self, name):
        self.name = name
        self.cubed = False
    def cube(self):
        self.cubed = True
class FruitSalad:
    def __init__(self, *fruit_bowl):
        self.fruit = fruit_bowl
        self._cube_fruit()
    def _cube_fruit(self):
        for fruit in self.fruit:
            fruit.cube()
# Arrange
@pytest.fixture
def fruit_bowl():
    return [Fruit("apple"), Fruit("banana")]
def test_fruit_salad(fruit_bowl):
    # Act
    fruit_salad = FruitSalad(*fruit_bowl)
    # Assert
    assert all(fruit.cubed for fruit in fruit_salad.fruit)
I get the basic idea of what is happening on this page, but the inclusion of the * in the fruit_bowl argument is confusing to me.
For example, if you just want to initialize the classes by themselves the code would not work:
fruit_bowl = [Fruit("Apple"), Fruit("Banana")]
fruit_salad = FruitSalad(fruit_bowl)
returns the error message:
AttributeError: 'list' object has no attribute 'cube'
In this case replace the *fruit_bowl argument with just fruit_bowl works fine.
Then I realized that fruit_bowl was defined as a function, so I thought that would do the trick, but again just running the code outside of a test returned an error.
If I setup the code like this:
def fruit_bowl():
    return [Fruit("Apple"), Fruit("Banana")]
class Fruit():
    def __init__(self, name):
        self.name = name
        self.cubed = False
        
    def cube(self):
        self.cubed = True
class FruitSalad():
    
    def __init__(self, *fruit_bowl):
        self.fruit_bowl = fruit_bowl
        self._cube_fruit()
        
    def _cube_fruit(self):
        for fruit in self.fruit_bowl:
            fruit.cube()
Then running fruit_salad = FruitSalad(fruit_bowl) gives the error message AttributeError: 'function' object has no attribute 'cube'.
Does this mean the use of the *fruit_bowl argument is specific to how pytest works?  Ie, these things will only work if the argument is a function with the @fixture decorator added, or is there some other point I'm missing.
At the moment I find the listed code confusing because the non pytest code does not work as-is, so I struggle to see how I'd implement the use of fixtures with my own work.
 
    