podium icon indicating copy to clipboard operation
podium copied to clipboard

ExampleFactory(fields).from_list does not work if the fields are in the dict format

Open mariosasko opened this issue 5 years ago • 0 comments

🐛 Bug

This is a serious bug. If ExampleFactory is instantiated with fields in the dict format, calling from_list will throw an error. This line in ExampleFactory.from_list is the problem (self.fields is a dict so the loop is iterating over the field names):

for value, field in filter(lambda el: el[1] is not None, zip(data, self.fields)):

And this is my workaround (not tested!!!):

fields = self.fields.values() if isinstance(self.fields, dict) else self.fields
for value, field in filter(lambda el: el[1] is not None, zip(data, fields)):

The ExampleFactory tests don't cover this case.

EDIT: The same thing happens if the fields are passed as a list and ExampleFactory.from_dict is called.

Steps to Reproduce

Example source:

>>> from podium import Field
>>> from podium.datasets import ExampleFactory
>>>
>>> fields = {'f': Field('f')}
>>> ExampleFactory(fields).from_list(['some data'])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "c:\users\mario\desktop\takelab\podium\podium\datasets\example_factory.py", line 146, in from_list
    set_example_attributes(example, field, value)
  File "c:\users\mario\desktop\takelab\podium\podium\datasets\example_factory.py", line 357, in set_example_attributes
    set_example_attributes_for_single_field(example, field, val)
  File "c:\users\mario\desktop\takelab\podium\podium\datasets\example_factory.py", line 349, in set_example_attributes_for_single_field
    for name, data in field.preprocess(val):
AttributeError: 'str' object has no attribute 'preprocess'

mariosasko avatar Feb 06 '21 15:02 mariosasko